2011-01-16 10 views
5

¿Por qué¿Por qué tanto el mapa (^ 2) xs como el mapa (2 ^) xs funcionan como se esperaba en Haskell?

map (^2) [1..10] 

trabajo y también

map (2^) [1..10] 

trabajo?

Espero que solo funcione con uno de ellos, no para ambos.

pensé mapa sería iterar sobre todos los elementos de [1..10] y luego hacer

[1^2, 2^2, 3^2, ...] 

para map (^2) [1..10]. Entonces esperaría que cuando se da map (2^) [1..10], arrojaría un error sintax o algo así, porque necesitaría los números después del ^, no antes.

+4

¿Por qué esperas que solo funcione para uno de ellos? – sepp2k

+1

Tengo que decir que tampoco entendí la pregunta, hasta que luqui respondió. Si acabas de leer el [Informe Haskell] (http://www.haskell.org/onlinereport/haskell2010/), es obvio lo que significa '(^ 2)' y '(2 ^)'. (Entonces, de nuevo, leí toda la especificación del lenguaje antes de usar cualquier lenguaje de programación nuevo, me han dicho que es un hábito extraño ...) – ephemient

+0

Ese es un hábito extraño pero impresionante ephemient así que sigan así. – Davorak

Respuesta

16

La gramática Haskell tiene un apoyo especial para la construcción de este tipo, denominado "secciones de operador". Si tiene cualquier operador infijo, como dicen #$%, a continuación, la siguiente notación es compatible:

(#$%) = \x y -> x #$% y 
(#$% y) = \x -> x #$% y 
(x #$%) = \y -> x #$% y 

Por lo que esperan algo de consistencia matemática para romper esto, y si Haskell eran un lenguaje minúsculo como Forth, me inclinaría para estar de acuerdo con tu intuición La razón por la que funciona es básicamente "porque lo escribieron para que funcione así".

(se añadió también a reducir la ambigüedad - ¿significa f + xf aplica a dos argumentos, o significa + aplica a dos argumentos Ya que en realidad significa esto último, ¿cómo nos representamos la antigua Respuesta: usando? () para introducir una sección del operador.)

+0

¡Ah! "La razón por la que funciona es básicamente" porque lo escribieron para trabajar así "". ¡Eso era lo que parecía! luqui al rescate, como siempre! gracias –

+2

Bien descrito en [Haskell Report> Expressions> Sections] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-300003.5) –

0

(2 ^) crea una nueva función que toma un parámetro e invoca (2^parámetro). Es una forma de curryfication.

Aquí hay un enlace con la teoría detrás de él: Partial Application(Haskell.org)

+0

que no es exactamente lo que pedí en la publicación original (supongo que no fui muy explícito). mira las otras respuestas. gracias de todos modos –

+0

veo que ... disculpa por no entender la pregunta. –

3

Haskell sabe que ^ es un operador infijo por lo que interpreta (en notación matemática) (2^) como f(x) = 2^x y (^2) como f(x) = x^2.

Cuestiones relacionadas