(->)
a menudo se llama la "función de la flecha" o "tipo de función constructora", y si bien tiene una sintaxis especial, no hay que mucho de especial.
Es esencialmente un operador de tipo infijo. Dale dos tipos, y te da el tipo de funciones entre esos tipos. Al igual que 2 + 3
es azúcar sintáctica para (+) 2 3
, también lo es from -> to
azúcar sintáctica para (->) from to
. Puedes pensarlo como Function from to
si los símbolos son confusos.
En otras palabras, la instancia que ha mencionado se puede leer como
instance Monad (Function from) where ...
la que deja claro que estamos hablando de funciones que toman argumentos de algunos arbitraria (pero fijo) tipo. De hecho, esta instancia de mónada se encuentra en Control.Monad.Instances y es esencialmente la misma que the Reader monad.
En cuanto a the source, es realmente muy simple:
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r
Los valores triviales dadas por return
ignoran el argumento, y el operador (>>=)
distribuye el argumento r
a ambos lados.
También es interesante observar que en el correspondiente Applicative
ejemplo para las funciones, pure
y (<*>)
corresponden a los combinadores K y S de the SKI combinator calculus.
(->)
también se generaliza por Arrow type class. Una introducción a las flechas can be found here.
Por último, tenga en cuenta que el símbolo ->
también aparece en otras partes más o menos inconexas de la sintaxis, incluidas las abstracciones lambda \x -> ...
, expresiones de casos case ... of x -> ...
, etc.El símbolo inverso <-
también ocurre en varios contextos no relacionados. No confundas a aquellos con la flecha de función.
Nota: Debería ser 'instancia Monad ((->) r)'. '(->)' toma dos argumentos de tipo, mientras que 'Monad' es para tipos que toman solo uno, por lo que primero debe aplicarlo parcialmente. – hammar