这是我一直致力于的第二个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
我该如何解决这个问题?
答案 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
能够完成包含其内容的足够工作。惯用标准ML在上述情况之外并不真正使用分号;但是这样做是可以的,只要你不开始考虑过程语言并期望分号“终止语句”或类似的东西。显然,在标准ML中使用;
与在诸如C语言及其句法后代之类的语言中使用;
之间存在关系,但它不是直接的。
答案 1 :(得分:1)
我确信这些功能是递归的,但这里有一些较短的功能:
fun even x = x mod 2 = 0
val odd = not o even