Frage

Ist es in Haskell möglich, den Funktionspfeiltypkonstruktor (->) nur auf seinen rechten Typ anzuwenden (zum Beispiel:(-> a)), um einen Typkonstruktor der Art * -> * zu erhalten?

War es hilfreich?

Lösung

Nein, das ist derzeit nicht möglich.Es gibt bestimmte Einschränkungen für das Typsystem von Haskell, die es in den meisten Fällen nützlich und praktisch machen, und dies ist eine dieser Einschränkungen.Ihre beste Alternative ist die Verwendung eines neuen Typs.

newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r }

Newtypes sind lediglich Tags, die dem Compiler helfen sollen, die Typprüfung durchzuführen und den typgesteuerten Versand (Typklassen) ordnungsgemäß durchzuführen.Vermutlich wollten Sie die Typargumente umdrehen, um eine Typklasseninstanz bereitzustellen.Das bedeutet lediglich, dass Sie jedes Mal, wenn Sie die Funktionen dieser Typklasse nutzen möchten, bestimmte Eingaben mit dekorieren müssen FuncFlip, und entzieren Sie alle spezifischen Ausgaben mit unFuncFlip.Dies ist etwas ausführlicher als gewünscht, aber eigentlich nicht so schlimm, da Sie dadurch gezwungen werden, explizit anzugeben, welche Instanz der Typklasse Sie verwenden möchten.

Sie können eine Instanz von erstellen Neuer Typ dafür, was sich für Sie als bequem erweisen kann oder auch nicht.

instance Newtype (FuncFlip r a) (a -> r) where
  pack = FuncFlip
  unpack = unFuncFlip

Weiterführende Literatur: Gibt es „Kombinationen auf Typebene“?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top