此表达式具有类型单位,但表达式应为 int 类型

  • 本文关键字:类型 表达式 int 单位 ocaml
  • 更新时间 :
  • 英文 :


我在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 变量工作原理的误解。像soma这样的OCaml变量是不可变的。您无法更改其值。因此,表达式 soma = soma + 1 实际上是一个比较,用于说明两个值是否相等:

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

一般来说,你需要找到一种方法来解决问题,而不给变量赋值;即,不改变它们的值。

如果你刚刚开始函数式编程,这似乎是荒谬的。然而,事实证明这只是另一种看待事物的方式。

最新更新