部分函数应用程序中的语法错误

时间:2017-01-12 17:13:34

标签: lambda sml smlnj ml

我试图在SML NJ中使用被操纵的lambda表达式,并且由于某种原因它会引发错误。我的" program.sml"中的代码:

http://yourdomain.com/yourVaadinApp/

命令后出错'使用" program.sml"在ubuntu终端:

 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

它绝对是" plus"行,因为否则没有错误。我尝试过有趣的加=(加1);' (括号),引发同样的错误。 也许我错过了一个包,或者其他什么。任何人都可以解释一下吗?

2 个答案:

答案 0 :(得分:4)

val plus,而不是fun plusfun plus是通过赋予函数体来定义函数的特殊语法; val plus表示“将名称plus定义为右侧的任何内容”,在这种情况下恰好是一个函数。

答案 1 :(得分:3)

使用

let iclassB: IClassB = new ClassB();
let classA: ClassA = new ClassA( iclassB );

您(正确)定义了一个函数。它的类型是

fun add x y= x + y;

这意味着它是一个高阶函数,它以fn: int -> int -> int 作为输入并返回int函数作为输出。

您现在需要使用这个函数来定义一个新值int -> int(它恰好是一个函数)。

因此(正如@jacobm已经指出的那样),只需使用:

plus

微妙的是,SML功能是"一流的价值观"。除了使用val plus = add 1; 在顶级定义之外,您还可以自由创建它们并将它们作为普通值传递。以curry形式定义函数的原因之一(您定义fun的方式)是您可以将其用作函数工厂,可以根据需要创建函数,而无需显式定义它们。

顺便说一句,你问题的标题有点误导。在SML中,短语" lambda表达"通常保留用于使用add创建的匿名函数。 lambda演算语法fn相当于SML中的x.。如果您想将fn x =>显式定义为lambda表达式,您可以使用:

add

请注意,lambda表达式不需要关键字val add = fn x => fn y => x + y; 来定义。