Angenommen, ich habe einen Datentyp A
, der anwendbar ist. (Für das Beispiel können wir annehmen, dass A
ist Identity
).
Ich habe jetzt einen neuen Datentyp, der der "Transformation" von einem A
zu einem anderen entspricht:
Ich möchte die triviale Applicative-Instanz für (B a)
definieren, die eine neue Transformation erzeugt, die beide Argumente von <*>
auf ihre Eingabe anwendet und dann die Definition von & lt; * & gt; aus der Applicative Instanz von A.
Das zu formulieren ist einfach genug:
%Vor% Ich habe jedoch das Gefühl, dass es eine einfache, punktefreie Möglichkeit geben sollte, dies zu schreiben, indem man (-> a)
als Applicative Functor verwendet.
Als Beispiel für meine Überlegungen betrachte ich meine Definition der entsprechenden Funktor-Instanz:
%Vor%Gibt es eine ähnlich einfache Möglichkeit, die Applicative-Instanz zu definieren?
Eine der netten Fakten zu Applicative
ist, dass diese Klasse unter der Zusammensetzung geschlossen ist. Sie können Folgendes von Data.Functor.Compose
erhalten:
Die Applicative
-Instanz für (->) a
, die Sie aufrufen, ist dies:
Nun erweitern wir Compose ff <*> Compose fa :: Compose ((->) (A a)) A b
(einige übersprungene Schritte):
Was Sie also tun, ist effektiv die Zusammensetzung von (->) (A a)
und A
.
Um auf die Antwort von Luis Casillas zurückzukommen: Wenn B
buchstäblich der Datentyp ist, mit dem Sie arbeiten, können Sie einfach Compose ((->) (A a)) A
verwenden. Der Datenkonstruktor hätte den Typ Compose :: (A a -> A b) -> Compose ((->) (A a)) A b
.
Sie können auch ein Typen-Synonym verwenden: type B a = Compose ((->) (A a)) A
.
Sie können eine Menge Spaß zusammen mit Compose
, Product
, Sum
und Freunden haben.
Tags und Links haskell functional-programming typeclass