Anwendbare Instanz für Funktionen von derselben Domäne in Applicative

8

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:

%Vor%

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?

    
DanielM 31.10.2014, 21:20
quelle

3 Antworten

12

Eine der netten Fakten zu Applicative ist, dass diese Klasse unter der Zusammensetzung geschlossen ist. Sie können Folgendes von Data.Functor.Compose erhalten:

%Vor%

Die Applicative -Instanz für (->) a , die Sie aufrufen, ist dies:

%Vor%

Nun erweitern wir Compose ff <*> Compose fa :: Compose ((->) (A a)) A b (einige übersprungene Schritte):

%Vor%

Was Sie also tun, ist effektiv die Zusammensetzung von (->) (A a) und A .

    
Luis Casillas 31.10.2014, 21:38
quelle
7

Dies wahrscheinlich?

%Vor%     
user3237465 31.10.2014 21:33
quelle
2

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.

    
Christian Conkle 01.11.2014 03:39
quelle