我在OCaml的程序中存在错误,正在寻求帮助。

错误:

This expression has type unit but an expression was expected of type int

具有错误的行错误包含soma = soma
let soma = 0;;
let rec nBell n =
if n == 0 then 1
    else
        for k=0 to n-1 do
        soma = soma + ((fact(n-1)/(fact(k)*fact((n-1)-k))) * nBell(k));
            done;;`

谁能帮我?

最佳答案

正如最近在这里多次提到的那样,OCaml没有语句。它只有表达式。为了使if表达式有意义,thenelse部分必须为同一类型。在您的代码中,then部分是1。即,其类型为int。在else部分中,您有一个for表达式。 for表达式的类型是unit。这就是编译器所抱怨的。

但是,解决此问题只是第一步,因为您的代码基于对OCaml变量如何工作的误解。 OCaml变量(如soma)是不可变的。您无法更改其值。因此,表达式soma = soma + 1实际上是一个比较,它告诉两个值是否相等:

# let soma = 0;;
val soma : int = 0
# soma = soma + 1;;
- : bool = false

一般而言,您需要找到一种无需分配变量即可解决问题的方法。即,无需更改其值。

如果您只是从函数式编程开始,这似乎很荒谬。但是事实证明这只是另一种看待事物的方式。

10-08 00:59