2017-01-12 4 views
2

J'essaie d'utiliser des expressions lambda manipulées dans SML NJ et, pour une raison quelconque, cela génère une erreur. le code dans mon "program.sml":Erreur de syntaxe dans l'application de fonction partielle

fun add x y = x + y; // (x. y. A x y) 
fun plus = add 1; // (x. y. A x y) 1 --> (y. A 1 y) -(e.g.)plus 4=5 

erreur après commande « utilisation "program.sml" dans le terminal ubuntu: ligne

program.sml:2.5-2.9 Error: can't find function arguments in clause 
uncaught exception Error 
raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27 
     ../compiler/TopLevel/interact/evalloop.sml:44.55 
     ../compiler/TopLevel/interact/evalloop.sml:292.17-292.20 

Il est certainement le "plus", car sinon il y a pas d'erreur. et j'ai essayé 'fun plus = (ajouter 1);' (parenthèses), ce qui soulève la même erreur. Peut-être qu'il me manque un paquet, ou peu importe. Quelqu'un peut-il expliquer cela?

+0

Une fonction qui ajoute un à son entrée peut être appelée 'incr' ou' succ'. –

Répondre

3

Avec

fun add x y= x + y; 

Vous êtes (correctement) définissant une fonction. Son type est

fn: int -> int -> int 

ce qui signifie qu'il est une fonction d'ordre supérieur qui prend une int en entrée et retourne une fonction de int -> int en sortie.

Vous devez maintenant utiliser cette fonction pour définir une nouvelle valeur, plus (qui se trouve être une fonction à part entière).

Ainsi (comme @jacobm a déjà souligné), il suffit d'utiliser:

val plus = add 1; 

La subtilité est que dans les fonctions SML sont des « valeurs de première classe ». En plus de définissant eux au niveau supérieur en utilisant fun vous pouvez librement les créer et les transmettre comme des valeurs ordinaires. L'une des raisons pour définir une fonction sous forme curry (la façon dont vous avez défini add) est que vous pouvez l'utiliser comme une fabrique de fonctions qui peut être utilisée pour créer des fonctions selon vos besoins sans les définir explicitement. En passant, le titre de votre question est quelque peu trompeur. En SML, l'expression "expression lambda" est généralement réservée aux fonctions anonymes créées en utilisant fn. La syntaxe de calcul lambda x. est équivalente à fn x => en SML. Si vous voulez définir add explicitement comme une expression lambda que vous utilisez:

val add = fn x => fn y => x + y; 

Notez que les expressions lambda ne ont pas besoin de définir le mot-clé fun.

4

val plus, et non fun plus. fun plus est une syntaxe spéciale pour définir une fonction en donnant le corps de la fonction; val plus signifie "définir le nom plus comme tout ce qui est sur le côté droit", qui dans ce cas se trouve être une fonction.