在Think Ocaml书中作者给出了这个例子:
let rec countdown n =
if n <= 0 then
( print_string "Blastoff!";
print_newline())
else ( print_int n; print_newline();
countdown (n-1); ());;
该函数接受一个 int 并返回一个单位。然而,正如书中提到的,该代码应该适用于负数,但事实并非如此。 代码逻辑看起来不错,没有什么问题。我想我应该与了解 Ocaml 的人分享,看看这里出了什么问题。
写作
countdown -1
并不代表你所期望的意思。问题是 - 是一个中缀运算符,具有以下签名:
# (-);;
- : int -> int -> int = <fun>
如您所见,它是一个接受 2 个整数参数并返回一个整数的函数。这是减法“a - b”。上面的语句将被解析为:
(countdown) - (1)
倒计时的类型为
int -> unit
,而不是预期的类型 int
。
您想要的是对数字求反的一元减号。 ocaml 语法的编写使得以 - 开头的表达式使用一元减号,但表达式中间的任何减号都是二进制减号。所以你必须写以下之一:
countdown (-1)
countdown ~-1