2010-03-13 17 views
15

ho la funzione qui sotto e funziona:curry funzione anonima in SML

(fn x => x * 2) 2; 

ma questo non funziona:

(fn x y => x + y) 2 3; 

Qualcuno può dirmi perché? Oppure dammi qualche suggerimento per farlo funzionare?

+0

funziona quando ho modificato questo (fn (x, y) => x + y) (2,3); ma perché (fn x y => x * y) 2 3; produce un errore – jjennifer

risposta

30

(fn x => fn y => x+y) 2 3; opere. fn semplicemente non ha lo stesso zucchero sintattico per definire le funzioni elaborate che ha fun.

0

In standard ML, una funzione può avere solo un argomento, quindi utilizzare

(fn (x,y) => x + y) (2,3) 

e il tipo è

fn: int * int -> int 

in questo momento (x, y) e (2, 3) è una struttura di lista,

+0

ma che lo modifica in una funzione non sollecitata, che è diversa – newacct

+0

Oh, currying! Scusa, non ho riscontrato il problema, la risposta di sepp2k è buona. – Waverim

+0

Inoltre, (2,3) non è una struttura di lista è una tupla di tipo int * int, che è diversa dalla lista di tipo int che sarebbe il tipo di [2,3]. – Mateo

0

Le risposte pubblicate sopra sono corrette. Le funzioni SML richiedono solo un argomento. Come risultato, le funzioni SML possono avere solo uno dei due tipi di input:

1) t = (t1 * t2 * ... * tN), per qualche N

2) t = a, per alcuni a.

Quindi, tecnicamente parlando, SML solo prende i tipi di prodotti o tipi unarie come argomenti alle funzioni. In generale, si può pensare a questo come a Unario o a una proiezione di un certo tipo di prodotto.

al fine di avere currying all'interno funzioni anonime, non esitate a nido al loro interno l'altro come: fn x1 => fn x2 => ... fn xN => ...

penso che sia anche importante sapere che: fun a = fn x1 => fn x2 => ... fn xN => ... è la piena espansione dello zucchero syntact : fun a x1 x2 .. xN

Problemi correlati