为什么ocaml中的此递归示例不适用于负数?

时间:2019-07-13 16:37:32

标签: recursion ocaml

作者在Think Ocaml book中给出了以下示例:

let rec countdown n = 
    if n <= 0 then 
      ( print_string "Blastoff!"; 
        print_newline()) 
    else ( print_int n; print_newline(); 
       countdown (n-1); ());;

该函数接受一个int并返回一个单位。但是,该代码假定可以使用本书中提到的负数,但事实并非如此。 代码的逻辑似乎很好,并且没有错。我以为可以和认识Ocaml的人分享一下,看看这里出了什么问题。

1 个答案:

答案 0 :(得分:3)

写作

countdown -1

并不表示您期望的意思。问题是-是具有以下签名的中缀运算符:

# (-);;
- : int -> int -> int = <fun>

如您所见,它是一个带有2个整数参数并返回整数的函数。这是减法“ a-b”。上面的语句将解析为:

(countdown) - (1)

倒计时的类型为int -> unit,而不是预期的类型int

您想要的是一元负号,它使数字取反。编写ocaml语法是为了使以-开头的表达式使用一元减号,但表达式中间的任何减号都是二进制减号。所以你必须写:

countdown (-1)