2013-10-13 61 views
3

我在OCaml的程序中有一个错误,我在寻求帮助。此表达式具有类型单位,但表达式类型为int

错误:

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;;` 

谁能帮助我?

回答

7

正如最近在这里提到的很多次,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 

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

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

相关问题