作者在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的人分享一下,看看这里出了什么问题。
答案 0 :(得分:3)
写作
countdown -1
并不表示您期望的意思。问题是-是具有以下签名的中缀运算符:
# (-);;
- : int -> int -> int = <fun>
如您所见,它是一个带有2个整数参数并返回整数的函数。这是减法“ a-b”。上面的语句将解析为:
(countdown) - (1)
倒计时的类型为int -> unit
,而不是预期的类型int
。
您想要的是一元负号,它使数字取反。编写ocaml语法是为了使以-开头的表达式使用一元减号,但表达式中间的任何减号都是二进制减号。所以你必须写:
countdown (-1)