(->)
è spesso chiamata la "funzione di freccia" o "tipo di funzione di costruzione", e mentre ha alcuni sintassi speciale, non c'è che molto speciale.
È essenzialmente un operatore di tipo infisso. Dagli due tipi e ti dà il tipo di funzioni tra questi tipi. Proprio come 2 + 3
è zucchero sintattico per (+) 2 3
, quindi è from -> to
zucchero sintattico per (->) from to
. Puoi pensare ad esso come Function from to
se i simboli sono confusi.
In altre parole, l'istanza lei ha citato può essere letta come
instance Monad (Function from) where ...
che rende chiaro che stiamo parlando di funzioni che accettano argomenti di alcuni arbitraria (ma fissa) tipo. In effetti, questa istanza monad si trova in Control.Monad.Instances ed è essenzialmente la stessa di the Reader monad.
Guardando the source, è davvero molto semplice:
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r
I valori banali fornite dal return
ignorano l'argomento, e l'operatore (>>=)
distribuisce l'argomento r
su entrambi i lati.
È inoltre interessante notare che nel corrispondente Applicative
esempio per funzioni, pure
e (<*>)
corrispondono ai combinatori K e S di the SKI combinator calculus.
(->)
è anche generalizzato dal Arrow type class. Introduzione alle frecce can be found here.
Infine, notare che il simbolo ->
appare anche in altre parti più o meno estranee della sintassi, incluse le astrazioni lambda \x -> ...
, le espressioni di caso case ... of x -> ...
, ecc.Il simbolo di inversione <-
si verifica anche in diversi contesti non correlati. Non confondere quelli con la freccia funzione.
Nota: che dovrebbe essere 'istanza Monad ((->) r)'. '(->)' accetta due argomenti di tipo, mentre 'Monad' è per i tipi che ne prendono uno solo, quindi è necessario applicarlo parzialmente. – hammar