2010-03-13 8 views
15

J'ai la fonction ci-dessous et il fonctionne:cari fonction anonyme dans SML

(fn x => x * 2) 2; 

mais celui-ci ne fonctionne pas:

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

Quelqu'un peut-il me dire pourquoi? Ou me donner un indice pour le faire fonctionner?

+0

cela fonctionne quand j'ai changé à ce (fn (x, y) => x + y) (2,3); mais pourquoi (fn x y => x * y) 2 3; produit une erreur – jjennifer

Répondre

30

(fn x => fn y => x+y) 2 3; fonctionne. fn n'a simplement pas le même sucre syntaxique pour définir des fonctions curry que fun a.

0

Dans Standard ML, une fonction ne peut avoir qu'un un argument, afin d'utiliser

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

et le type est

fn: int * int -> int 

dans ce temps (x, y) et (2, 3) est une structure de liste,

+0

mais cela le change en une fonction non perturbée, ce qui est différent – newacct

+0

Oh, en cours! Désolé, je n'ai pas compris le problème, la réponse de sepp2k est bonne. – Waverim

+0

Aussi, (2,3) n'est pas une structure de liste est un tuple de type int * int, qui est différent de type int liste qui serait le type de [2,3]. – Mateo

0

Les réponses affichées ci-dessus sont correctes. Les fonctions SML prennent seulement un argument. Par conséquent, les fonctions SML peuvent avoir un seul des deux types d'entrée:

1) t = (t1 * t2 * ... * tN), pour une N

2) t = a, pour une a.

Ainsi, techniquement parlant, SML uniquement prend types de produits ou types unaire comme arguments aux fonctions. On peut plus généralement considérer cela comme un type unaire ou une projection d'un type de produit.

Afin d'avoir taitement intérieur fonctions anonymes, les libres de nid sentir dans l'autre comme: fn x1 => fn x2 => ... fn xN => ...

Je pense qu'il est aussi important de savoir que: fun a = fn x1 => fn x2 => ... fn xN => ... est la pleine expansion du sucre Syntact : fun a x1 x2 .. xN