2017-05-10 57 views
1

这是我一直在研究的第二个SML程序。这些功能是相互递归的。如果我称奇(1),我应该是真的,甚至(1)我应该是假的。这些函数应该适用于所有正整数。然而,当我运行这个程序:如果号码是奇数或甚至是SML

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 

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

回答

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做足够的工作brac推广他们的内容。
  • 如果你正在使用交互式REPL(读取评估打印循环),在顶级声明的末尾分号的意思是“好了,现在居然继续前进,阐述/评估/等一切至今”。

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

1

我敢肯定有在做这些函数的递归说教点,但这里的一些短的:

fun even x = x mod 2 = 0 
val odd = not o even 
相关问题