pattern - ¿Dónde puedo leer sobre el operador "->" de haskell?
pattern matching haskell (2)
Me gustaría leer más sobre el operador ->
haskell. No tengo muy claro cuánto difumina la línea entre la sintaxis especial y algún tipo de clase de tipo, y me gustaría echar un vistazo. Específicamente, he visto cosas como esta:
instance Monad ((->) r) where ...
Eso ha despertado mi interés.
Sin embargo, cuando trato de buscar "flecha de haskell" o "función de haskell" o "función de clase de haskell", me encuentro con los problemas obvios de obtener resultados para Control.Arrow
o tutoriales de clase de tipo simple.
¿Cómo se llama ->
y dónde puedo leer más sobre esto?
Creo que se llama la flecha. Según " Real World Haskell ":
-> tiene un solo significado: denota una función que toma un argumento del tipo de la izquierda y devuelve un valor del tipo de la derecha.
(->)
menudo se denomina "flecha de función" o "constructor de tipo de función", y aunque tiene una sintaxis especial, no tiene 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áctico para (+) 2 3
, así es from -> to
azúcar sintáctico para (->) from to
. Puede pensarlo como Function from to
si los símbolos son confusos.
En otras palabras, la instancia que mencionó se puede leer como
instance Monad (Function from) where ...
lo que deja claro que estamos hablando de funciones que toman argumentos de algún tipo arbitrario (pero fijo). De hecho, esta instancia de mónada se encuentra en Control.Monad.Instances y es esencialmente la misma que la mónada de Reader .
En cuanto a la fuente , es realmente muy simple:
instance Monad ((->) r) where
return = const
f >>= k = / r -> k (f r) r
Los valores triviales dados por return
ignoran el argumento, y el operador (>>=)
distribuye el argumento r
a ambos lados.
También es interesante observar que en la instancia de Applicative
correspondiente para funciones, pure
y (<*>)
corresponden a los combinadores K y S del cálculo del combinador SKI .
(->)
también está generalizado por la clase de tipo Arrow . Una introducción a las flechas se puede encontrar aquí .
Por último, tenga en cuenta que el símbolo ->
también aparece en otras partes más o menos no relacionadas de la sintaxis, incluidas las abstracciones lambda /x -> ...
, expresiones de case ... of x -> ...
, case ... of x -> ...
, etc. símbolo <-
también ocurre en varios contextos no relacionados. No los confundas con la flecha de función.