使用SML判断数字是奇数还是偶数

时间:2017-05-10 04:18:11

标签: recursion sml smlnj ml mutual-recursion

这是我一直致力于的第二个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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:7)

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

因此,编译器正在爆炸引用未声明的fun odd (n) = if n=0 then false else even (n-1)的无效声明even。如果要继续下去,接下来就会在声明开始时非法发生and

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

  • 表示法(...A... ; ...B... ; ...C...)表示“评估...A......B......C...,并返回...C...的结果。
    • 同样是符号let ... in ...A... ; ...B... ; ...C... end,其中括号是可选的,因为in ... end能够完成包含其内容的足够工作。
  • 如果你正在使用交互式REPL(读取 - 评估 - 打印循环),顶级声明末尾的分号意味着“好的,现在实际上继续并详细说明/评估/等等到目前为止的一切”

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

答案 1 :(得分:1)

我确信这些功能是递归的,但这里有一些较短的功能:

fun even x = x mod 2 = 0
val odd = not o even