我试图在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);' (括号),引发同样的错误。 也许我错过了一个包,或者其他什么。任何人都可以解释一下吗?
答案 0 :(得分:4)
val plus
,而不是fun plus
。 fun 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;
来定义。