Recursion 使用SML判断数字是奇数还是偶数
这是我一直在做的第二个SML项目。这些函数是相互递归的。如果我称奇(1)为真,称偶(1)为假。这些函数应该适用于所有正整数。但是,当我运行此程序时:Recursion 使用SML判断数字是奇数还是偶数,recursion,sml,smlnj,ml,mutual-recursion,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
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
<如何解决这个问题? 问题是中间的分号(<代码>;<代码>)。分号可以(可选)出现在完整声明的结尾,但就在
和之前不是声明的结尾
因此编译器在无效声明fun-odd(n)=如果n=0,则为false-else-偶数(n-1)
上爆炸,该声明表示未声明的偶数。如果继续进行,它将在声明开始时非法发生和
请注意,只有两种情况下分号有意义:
- 符号
(…A…;…B…;…C…)
表示“评估…A…
,…B…
,和…C…
,并返回…C…
的结果。
- 同样,表示法
let…in…A…;…B…;…C…end
,其中括号是可选的,因为…end
中的对括号中的内容起到了足够的作用
如果您使用的是交互式REPL(read-evaluate-print循环),那么顶级声明末尾的分号表示“好,现在就开始详细说明/evaluate/etc.到目前为止的所有内容”
惯用的标准ML在上述情况之外并不真正使用分号;但是这样做是可以的,只要您不开始考虑过程语言并期望分号“终止语句”“,或诸如此类。显然,的使用有一定的关系标准ML中的code>和的使用,但不是直接的。 问题是中间的分号(<代码>;<代码>)。分号可以(可选)出现在完整声明的结尾,但就在和之前不是声明的结尾
因此编译器在无效声明fun-odd(n)=如果n=0,则为false-else-偶数(n-1)
上爆炸,该声明表示未声明的偶数。如果继续进行,它将在声明开始时非法发生和
请注意,只有两种情况下分号有意义:
- 符号
(…A…;…B…;…C…)
表示“评估…A…
,…B…
,和…C…
,并返回…C…
的结果。
- 同样,表示法
let…in…A…;…B…;…C…end
,其中括号是可选的,因为…end
中的对括号中的内容起到了足够的作用
如果您使用的是交互式REPL(read-evaluate-print循环),那么顶级声明末尾的分号表示“好,现在就开始详细说明/evaluate/etc.到目前为止的所有内容”
惯用的标准ML在上述情况之外并不真正使用分号;但是这样做是可以的,只要您不开始考虑过程语言并期望分号“终止语句”“,或诸如此类。显然,的使用有一定的关系标准ML中的code>和的使用代码>在C及其语法后代等语言中,但它不是直接的。我确信让这些函数递归是有道理的,但这里有一些较短的函数:
fun even x = x mod 2 = 0
val odd = not o even
我相信让这些函数递归是有道理的,但这里有一些较短的函数:
fun even x = x mod 2 = 0
val odd = not o even