2012-05-07 6 views
10

me di cuenta de que yo estaba jugando con Haskell hoy que es posible hacer algo como

($ 4) (> 3) 

que produce True. ¿Que esta pasando aqui? Sería genial tener algo de intuición.

¿Mi conjetura? Parece que el ($ 4) es una aplicación de función incompleta, pero cuando estoy confundido es que $ es un operador infijo, ¿no debería parecerse al (4 $)? Esto no compila, tan claramente no, lo que me lleva a creer que realmente no entiendo lo que está pasando. El término (>3) tiene sentido para mí, porque si proporciona algo como (\x -> x 4) (>3), termina con el mismo resultado.

+1

Las respuestas son excelentes, pero me gustaría agregar que '(\' op \ 'e)' es azúcar sintáctica para '(\ x -> x \' op \ 'e)' y '(e \' op \ ')' for '(\ x -> e \' op \ 'x)', donde '\' op \ '' es operador (ya sea uno normal como '+', '-' etc, o función en backticks). – Vitus

+2

lee '(f $)' como "_call the_ function f"; lea '($ 4)' como "_call with_ 4 como argumento". "Llamar con 4" "es mayor que 3?" es "¿4 es mayor que 3?". '($ 4) (> 3) == (> 3) 4 == 4> 3 == (4>) 3'. –

Respuesta

19

($ 4) es lo que se llama section. Es una forma de aplicar parcialmente un operador infijo, pero proporciona el lado derecho en lugar del izquierdo. Es exactamente equivalente a (flip ($) 4).

De forma similar, (> 3) es una sección.

($ 4) (> 3) 

puede reescribirse como

(flip ($) 4) (> 3) 

que es el mismo que

flip ($) 4 (> 3) 

que es el mismo que

(> 3) $ 4 

Y en este punto, debería ser claro que esto se reduce a (4 > 3).

+0

Oh, eso es genial. Muchas gracias. – apc

+5

@apc: en caso de que no esté demasiado familiarizado con la aplicación parcial, observe que la firma de tipo 'add :: Int -> Int -> Int' puede escribirse más explícitamente como' add :: Int -> (Int -> Int) ', es decir," add es una función que toma un 'Int' y devuelve una función' Int -> Int'. También google "currying haskell". – jberryman

+0

Gracias @jberryman. De hecho, lo sabía, pero es bueno que lo mencioné para otros noobs. :) – apc

12

Puede aplicar parcialmente un operador infijo desde cualquier lado. Para operadores conmutativos como +, no importa si dice (+ 1) o (1 +), pero por ejemplo para la división puede suministrar el dividendo (5 /) o el divisor (/ 5).

El operador aplicación de función toma una función como el operando de la izquierda y un parámetro como el operando de la derecha (f $ x), para que pueda aplicar parcialmente, ya sea con una función (f $) o con un parámetro ($ x). Así que dado

($ 4) (> 3) 

En primer lugar, aplicar parcialmente el $ -operator con el parámetro 4 y suministro con la función (> 3). Entonces, ¿qué es esto convierte esencialmente en

(> 3) $ 4 

¿Qué es la misma que (4 > 3).

6

($ 4) es la función que toma una función y aplica 4 a ella.

(> 3) es la función que toma un número y comprueba si es mayor que 3.

Por lo tanto, al darle la última función al anterior, esencialmente aplica 4 a la función que verifica si su entrada es mayor que 3, y así obtiene True.

Cuestiones relacionadas