2012-02-03 18 views
21

Me gustaría leer más sobre el operador de -> de 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 hacer algunas preguntas. Específicamente, he visto cosas como esta:¿Dónde puedo leer en el operador "->" de haskell?

instance Monad ((->) r) where ... 

Que han despertado mi interés.

Sin embargo, cuando trato de buscar "haskell arrow" o "haskell function" o "haskell class function", me encuentro con los obvios problemas de obtener resultados para Control.Arrow o tutoriales de clase de tipo simple.

¿Cómo se llama -> y dónde puedo leer más al respecto?

+2

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

Respuesta

27

(->) 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.

+1

Excelente respuesta, como siempre. Se podría argumentar, sin embargo, que la -> en las expresiones lambda está más relacionada con el operador de tipo de lo que uno podría pensar. Y, por supuesto, '(\ a -> b) c' es' caso c de a -> b' y viceversa. – Ingo

0

Creo que es llamado la flecha. De acuerdo con "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.

+1

Esto es en firmas de tipo, pero OP está hablando de una función – amindfv