Ich habe diesen Typ schon mal gesehen, ohne zu wissen, was es bedeutet. Bedeutet es etwas und / oder hat es einen Namen?
%Vor% 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:
((->) 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
Die anwendbare Operation <*>
gibt Ihnen Gleichzeitigkeit :
Obwohl wir tatsächlich instance Monoid [a]
und instance Monoid m => Monoid t -> m
haben, kann das vorherige Beispiel folgendermaßen geschrieben werden:
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.
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.
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 (.)
Tags und Links haskell types type-constructor