2013-10-13 100 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 

一般來說,你需要找到一種方法來解決你的問題,而分配給變量;即不改變它們的值。

如果你剛開始使用函數式編程,這看起來很荒唐。然而事實證明,這只是另一種看待事物的方式。

相關問題