Was bedeutet "((-) a)"?

8

Ich habe diesen Typ schon mal gesehen, ohne zu wissen, was es bedeutet. Bedeutet es etwas und / oder hat es einen Namen?

%Vor%     
Carlos López-Camey 17.12.2012, 00:37
quelle

3 Antworten

5

Um den technischen Antworten von Matt Fenwick und josefg hinzuzufügen, kann ((->) a als Typkonstruktor gelesen werden, der Werte bildet, die von a abhängen. Ein Beispiel: Angenommen, Sie haben Teams, deren Mitgliedschaft sich im Laufe der Zeit ändert. Eine Möglichkeit, dies darzustellen, ist wie folgt:

%Vor%

((->) a) ist ein Functor , Applicative und Monad , was bedeutet, dass die Typklassenoperationen verfügbar sind, und sie haben sehr nützliche Interpretationen, wenn sie mit Historical t verwendet werden.

Erstes Beispiel: fmap wendet eine Funktion auf einen zeitabhängigen Wert an. Also zum Beispiel

%Vor%

Die anwendbare Operation <*> gibt Ihnen Gleichzeitigkeit :

%Vor%

Obwohl wir tatsächlich instance Monoid [a] und instance Monoid m => Monoid t -> m haben, kann das vorherige Beispiel folgendermaßen geschrieben werden:

%Vor%

Monad gibt dir die Komposition:

%Vor%

Beachten Sie auch, dass ((->) r genauso wie% Reader r monad ist. Wenn Sie den obigen Code verstehen, verstehen Sie Reader .

BEARBEITEN: Ich sollte klarstellen, dass zeitabhängige Werte nur eine Verwendung der Funktion / Reader-Monade sind. Es gibt andere Anwendungen; Der klassische Anwendungsfall der Reader-Monade besteht darin, Konfigurationswerte durch eine Berechnung zu fädeln. Es hat mehr Nutzen als nur das, wie das obige Beispiel zeigt.

    
Luis Casillas 18.12.2012, 23:34
quelle
9

Tatsächlich ist ((->) a) kein Typ, sondern ein teilweise angewendeter Typkonstruktor .

Genau wie Funktionen können Typkonstruktoren teilweise in Haskell angewendet werden.

Sie können die Art von etwas in GHCi überprüfen:

%Vor%

Alle Werte haben Arten von Arten * ; Typkonstruktoren haben Arten wie * -> * , * -> * -> * , etc.

    
Matt Fenwick 17.12.2012 00:44
quelle
5

In Haskell ist (->) a von a -> something . Denken Sie daran, dass Sie einen Operator mithilfe von parans in eine vorangestellte Funktion umwandeln können. zB (+) 1 1 == 2 . In diesem Fall ist der "Operator" der Typkonstruktor -> . Es wird auf diese Weise verwendet, da ein Funktor einen Typkonstruktor mit einer Variablen benötigt, aber -> hat 2. Also wenden wir ihn teilweise an.

Es kann Ihnen helfen zu erkennen, dass <$> für ((->) a) nur (.)

ist     
jozefg 17.12.2012 00:44
quelle

Tags und Links