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

Syntax error in partial function application

我正在尝试在 SML NJ 中使用可操纵的 lambda 表达式,但出于某种原因它引发了错误。我的代码 "program.sml":

 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

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

 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

肯定是"plus"那一行,否则就没有错误。我试过 'fun plus = (add 1);' (括号),这会引发同样的错误。 也许我丢了一个包裹,或者什么的。谁能解释一下?

val plus,而不是 fun plusfun plus 是通过给出函数体来定义函数的特殊语法; val plus 表示 "define the name plus as whatever's on the right-hand side," 在这种情况下恰好是一个函数。

fun add x y= x + y;

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

fn: int -> int -> int

这意味着它是一个 higher-order 函数,它接受一个 int 作为输入,returns 一个 function of int -> int 作为输出。

您现在只需要使用这个函数来定义一个新值,plus(它本身就是一个函数)。

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

val plus = add 1;

SML 函数的微妙之处在于 "first-class values"。除了在 top-level 使用 fun 定义 它们之外,您还可以自由创建它们并将它们作为普通值传递。以柯里化形式定义函数的原因之一(您定义的方式add)是您可以将其用作函数工厂,可用于根据需要创建函数而无需显式定义它们。

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

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

请注意,lambda 表达式不需要关键字 fun 来定义。