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

问题描述 投票:0回答:1

在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 的人分享,看看这里出了什么问题。

recursion ocaml
1个回答
3
投票

写作

countdown -1

并不代表你所期望的意思。问题是 - 是一个中缀运算符,具有以下签名:

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

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

(countdown) - (1)

倒计时的类型为

int -> unit
,而不是预期的类型
int

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

countdown (-1)
countdown ~-1
© www.soinside.com 2019 - 2024. All rights reserved.