部分函数应用程序中的语法错误
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 plus
。 fun 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
来定义。
我正在尝试在 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 plus
。 fun 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
来定义。