Mic*_*rum 1 recursion ml sml smlnj 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);
Run Code Online (Sandbox Code Playgroud)
我明白了:
[opening test.sml]
test.sml:2.35-2.39 Error: unbound variable or constructor: even
val it = () : unit
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
问题是;中间的分号().在完整声明结束时允许(可选)使用分号,但在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语言及其句法后代等语言的使用之间存在关联,但它并不是直接的.