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?
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?
(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
.
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,
ma che lo modifica in una funzione non sollecitata, che è diversa – newacct
Oh, currying! Scusa, non ho riscontrato il problema, la risposta di sepp2k è buona. – Waverim
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
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
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