tengo la función de abajo y funciona:al curry función anónima en SML
(fn x => x * 2) 2;
pero éste no funciona:
(fn x y => x + y) 2 3;
¿Puede alguien decirme por qué? ¿O darme alguna pista para que funcione?
tengo la función de abajo y funciona:al curry función anónima en SML
(fn x => x * 2) 2;
pero éste no funciona:
(fn x y => x + y) 2 3;
¿Puede alguien decirme por qué? ¿O darme alguna pista para que funcione?
(fn x => fn y => x+y) 2 3;
funciona. fn
simplemente no tiene el mismo azúcar sintáctico para definir las funciones al curry que tiene fun
.
En ml estándar, una función sólo puede tener un argumento, a fin de utilizar
(fn (x,y) => x + y) (2,3)
y el tipo es
fn: int * int -> int
en este tiempo (x, y) y (2, 3) es una estructura de lista,
pero eso lo cambia a una función no comprobada, que es diferente – newacct
¡Oh, currying! Lo siento, no entendí el problema, la respuesta de sepp2k es buena. – Waverim
Además, (2,3) no es una estructura de lista es una tupla de tipo int * int, que es diferente de la lista de tipo int que sería el tipo de [2,3]. – Mateo
Las respuestas publicadas arriba son correctas. Las funciones SML toman solo un argumento. Como resultado, las funciones SML pueden tener solamente uno de los dos tipos de entrada:
1) t = (t1 * t2 * ... * tN)
, por alguna N
2) t = a
, por alguna a
.
Así que, técnicamente hablando, SML única toma tipos de productos o tipos unarios como argumentos de funciones. En general, se puede pensar en esto como un tipo único o una proyección de algún tipo de producto.
Con el fin de tener currying dentro funciones anónimas, se sienten libres para anidar unos dentro de otros como: fn x1 => fn x2 => ... fn xN => ...
Creo que también es importante saber que: fun a = fn x1 => fn x2 => ... fn xN => ...
es la expansión completa del azúcar syntact : fun a x1 x2 .. xN
funciona cuando cambié a este (fn (x, y) => x + y) (2,3); pero por qué (fn x y => x * y) 2 3; produce un error – jjennifer