此表达式具有类型单元,但期望表达式为int类型

use*_*126 3 ocaml

我在OCaml的程序中有一个错误,我正在寻求帮助.

错误:

This expression has type unit but an expression was expected of type int
Run Code Online (Sandbox Code Playgroud)

包含错误的行错误 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;;`
Run Code Online (Sandbox Code Playgroud)

谁能帮我?

Jef*_*eld 8

正如最近在这里提到的那样,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
Run Code Online (Sandbox Code Playgroud)

一般来说,您需要找到一种方法来解决您的问题,而无需分配变量; 即,不改变他们的价值观.

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