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

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)

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

rua*_*akh 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语言及其句法后代等语言的使用之间存在关联,但它并不是直接的.