1

这是我一直在研究的第二个 SML 程序。这些函数是相互递归的。如果我调用奇数(1)我应该得到真,偶数(1)我应该得到假。这些函数应该适用于所有正整数。但是,当我运行这个程序时:

fun
    odd (n) = if n=0 then false else even (n-1);
and
    even (n) = if n=0 then true else odd (n-1);

我得到:

[opening test.sml]
test.sml:2.35-2.39 Error: unbound variable or constructor: even
val it = () : unit

我怎样才能解决这个问题?

4

2 回答 2

7

问题是中间的分号 ( ;)。在完整声明的末尾允许(可选)分号,但之前and不是声明的结尾!

所以编译器在fun odd (n) = if n=0 then false else even (n-1)引用 undeclared的无效声明上崩溃了evenand如果它继续进行,它会在声明开始时发生非法事件。


请注意,只有两种情况分号有意义:

  • 该符号的(...A... ; ...B... ; ...C...)意思是“计算...A...,...B......C..., 并返回...C....
    • 同样的符号let ... in ...A... ; ...B... ; ...C... end,其中括号是可选的,因为括号中in ... end的内容做得足够好。
  • 如果您使用交互式 REPL(读取-评估-打印循环),则在顶级声明末尾的分号表示“好的,现在实际上继续详细说明/评估/等等。到目前为止的一切”。

惯用标准 ML 在上述情况之外并没有真正使用分号。但是这样做是可以的,只要您不开始考虑程序语言并期望分号“终止语句”或类似的东西。;标准 ML 中的使用;与 C 及其语法后代等语言中的使用之间显然存在关系,但这不是直接的关系。

于 2017-05-10T04:23:23.580 回答
1

我确信使这些函数递归是有道理的,但这里有一些较短的:

fun even x = x mod 2 = 0
val odd = not o even
于 2017-05-10T07:31:27.973 回答