我在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;;`
任何人都可以帮助我吗?
答案 0 :(得分:7)
正如最近在这里提到的那样,OCaml没有任何陈述。它只有表达式。要使if
表达有意义,then
和else
部分必须属于同一类型。在您的代码中,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
一般来说,您需要找到一种方法来解决您的问题,而无需分配变量;即,不改变它们的价值。
如果您刚开始使用函数式编程,这似乎很荒谬。然而事实证明这只是另一种看待事物的方式。