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

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

这是我一直在做的第二个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

<如何解决这个问题?

问题是中间的分号(<代码>;<代码>)。分号可以(可选)出现在完整声明的结尾,但就在
之前不是声明的结尾

因此编译器在无效声明
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在上述情况之外并不真正使用分号;但是这样做是可以的,只要您不开始考虑过程语言并期望分号“终止语句”“,或诸如此类。显然,
    的使用有一定的关系
    的使用,但不是直接的。

    问题是中间的分号(<代码>;<代码>)。分号可以(可选)出现在完整声明的结尾,但就在
    之前不是声明的结尾

    因此编译器在无效声明
    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在上述情况之外并不真正使用分号;但是这样做是可以的,只要您不开始考虑过程语言并期望分号“终止语句”“,或诸如此类。显然,
    的使用有一定的关系
    的使用在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