if-then-else表达式有效,但cond不在ocaml factorial函数中

nac*_*hos 1 ocaml if-statement

let cond (a,b,c) =
    match a with
    | true -> b
    | false -> c

let rec fact n =
    cond (n=0,1, n * fact (n-1))

let rec fact n =
    if n=0 then 1 else n * fact (n-1)
Run Code Online (Sandbox Code Playgroud)

在上面的代码段中,第一个版本给出了堆栈溢出异常,而第二个版本正常工作.这两者有什么区别?他们似乎功能相同,但显然没有.

msc*_*idt 7

OCaml是严格的,即condcond调用时计算函数的所有参数.这包括调用fact(n-1)when n为零,即您将评估fact(-1)等等.因此,您有一个未终止的递归,因此堆栈溢出.

if-then-else语句的第二个示例仅评估其中一个案例,这样递归是有限的.