2012-05-07 16 views
10

ho notato come stavo giocando intorno con Haskell oggi che è possibile fare qualcosa di simile

($ 4) (> 3) 

che produce True. Che cosa sta succedendo qui? Sarebbe bello avere intuito.

La mia ipotesi? Sembra che l'($ 4) sia un'applicazione di funzione incompleta, ma dove sono confuso è che $ è un operatore infisso, quindi non dovrebbe sembrare (4 $)? Questo non è compilato, quindi chiaramente no, il che mi porta a credere che non capisco veramente cosa sta succedendo. Il termine (>3) ha senso per me, perché se si fornisce qualcosa come (\x -> x 4) (>3), si finisce con lo stesso risultato.

+1

Le risposte sono eccellenti, ma mi piacerebbe aggiungere che '(\' op \ 'e)' è zucchero sintattico per '(\ x -> x \' op \ 'e)' e '(e \' op \ ')' per '(\ x -> e \' op \ 'x)', dove '\' op \ '' è operatore (normale come '+', '-' etc, o funzione in apici inversi). – Vitus

+2

leggi '(f $)' come "_call the_ function f"; leggi '($ 4)' come "_call with_ 4 come argomento". "Chiama con 4" "è maggiore di 3?" è "4 è maggiore di 3?". '($ 4) (> 3) == (> 3) 4 == 4> 3 == (4>) 3'. –

risposta

19

($ 4) è ciò che viene chiamato section. È un modo per applicare parzialmente un operatore infisso, ma fornire il lato destro invece del sinistro. È esattamente equivalente a (flip ($) 4).

Analogamente, (> 3) è una sezione.

($ 4) (> 3) 

può essere riscritta come

(flip ($) 4) (> 3) 

che è la stessa come

flip ($) 4 (> 3) 

che è la stessa come

(> 3) $ 4 

E a questo punto, dovrebbe essere chiaro che questo si riduce a (4 > 3).

+0

Oh, è fantastico. Molte grazie. – apc

+5

@apc: nel caso in cui non si abbia familiarità con l'applicazione parziale, si noti che il tipo signature: add :: Int -> Int -> Int' può essere scritto in modo più esplicito come add: Int -> (Int -> Int) ', cioè" add è una funzione che prende un 'Int' e restituisce una funzione' Int -> Int'. Inoltre google "currying haskell" – jberryman

+0

Grazie @jberryman. In realtà lo sapevo, ma è una buona cosa che tu menzionato per altri noobs :) :) – apc

12

È possibile applicare parzialmente un operatore di infisso da entrambi i lati. Per operatori commutativi come +, non importa se si dice (+ 1) o (1 +), ma per esempio per la divisione è possibile fornire il dividendo (5 /) o il divisore (/ 5).

L'operatore applicazione funzione prende una funzione come operando sinistro e un parametro come operando destro (f $ x), in modo da poter applicare parzialmente o con una funzione (f $) o con un parametro ($ x). Quindi, dato

($ 4) (> 3) 

Per prima cosa applicare parzialmente il $ -operator con il parametro 4 e gli mette a disposizione la funzione (> 3). Così che cosa questo diventa essenzialmente è

(> 3) $ 4 

Che è lo stesso di (4 > 3).

6

($ 4) è la funzione che accetta una funzione e applica 4 ad esso.

(> 3) è la funzione che accetta un numero e verifica se è maggiore di 3.

Quindi assegnando l'ultima funzione al primo, si sta essenzialmente applicando 4 alla funzione che controlla se il suo input è maggiore di 3 e quindi si ottiene True.