2010-03-13 14 views
15

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?

+0

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

Respuesta

30

(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.

0

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,

+0

pero eso lo cambia a una función no comprobada, que es diferente – newacct

+0

¡Oh, currying! Lo siento, no entendí el problema, la respuesta de sepp2k es buena. – Waverim

+0

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

0

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

Cuestiones relacionadas