2011-01-16 6 views
5

PerchéPerché entrambe le mappe (^ 2) xs e map (2 ^) xs funzionano come previsto in Haskell?

map (^2) [1..10] 

lavoro e anche

map (2^) [1..10] 

lavoro?

Mi aspetterei che funzioni solo con uno di essi, non con entrambi.

ho pensato mappa sarebbe iterare su tutti gli elementi di [1..10] e poi fare

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

per map (^2) [1..10]. Quindi mi aspetto che quando viene dato map (2^) [1..10], potrebbe produrre un errore di sintassi o qualcosa del genere, perché avrebbe bisogno che i numeri fossero dopo lo ^, non prima.

+4

Perché ti aspetti che funzioni solo per uno di loro? – sepp2k

+1

Devo dire che non ho neanche capito la domanda, fino a quando Luqui non ha risposto. Se leggi semplicemente [Haskell Report] (http://www.haskell.org/onlinereport/haskell2010/) è ovvio cosa significano '(^ 2)' e '(2 ^)'. (Poi di nuovo, ho letto l'intera specifica del linguaggio prima di usare qualsiasi nuovo linguaggio di programmazione, mi è stato detto che è un'abitudine strana ...) – ephemient

+0

Questa è un'abitudine stravagante ma impressionante, quindi continua così. – Davorak

risposta

16

La grammatica Haskell ha un supporto speciale per costrutto come questo, chiamato "sezioni operatore". Se avete qualche operatore infisso, come dire #$%, quindi la seguente notazione è supportato:

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

Quindi ci si aspetta un po 'di consistenza matematica di rompere questo, e se Haskell fosse una lingua minuscolo come Forth, sarei propenso essere d'accordo con la tua intuizione Il motivo per cui funziona è fondamentalmente "perché l'hanno scritto per funzionare così".

(E 'stato aggiunto anche a ridurre l'ambiguità - vuol f + x significa f applicata a due argomenti, o significa + applicata a due argomenti Dal momento che in realtà significa quest'ultima, come facciamo noi rappresentiamo l'ex Risposta: utilizzando? () per introdurre una sezione operatore.)

+0

Ah! "Il motivo per cui funziona è fondamentalmente" perché l'hanno scritto per funzionare così "". era quello che sembrava! luqui in soccorso, come sempre! grazie –

+2

Ben descritto in [Haskell Report> Espressioni> Sezioni] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-300003.5) –

0

(2 ^) crea una nuova funzione che accetta un parametro e invoca (2^parametro). È un modo di curryfication.

Ecco un link con la teoria dietro di esso: Partial Application(Haskell.org)

+0

che non è proprio quello che ho chiesto nel post originale (credo che non ero molto esplicito). guarda le altre risposte. grazie comunque –

+0

vedo che ... mi dispiace per non aver capito la domanda. –

3

Haskell sa che ^ è un operatore infisso così interpreta (in notazione matematica) (2^) come f(x) = 2^x e (^2) come f(x) = x^2.

Problemi correlati