2017-10-09 55 views
2

我開始學習OCaml語言。你能告訴我爲什麼這段代碼顯示錯誤嗎?OCaml:爲什麼我得到這個錯誤?

let unite x = 
    if x < 100 then x mod 10 
    else if x >= 100 then x mod 100;; 

let dizaine x = 
    if x < 100 then x/10 
    else if x >= 10 then unite(x/10);; 

let centaine x = 
    if x >= 100 then x/100;; 


let somme_chiffre x = 
    if x >= 100 then unite x + dizaine x + centaine x 
    else if x > 9 then unite x + dizaine x 
    else unite x;; 

let div3 x = if ((somme_chiffre x) mod 3) = 0 then 1 else 0;; 

print_int(div3 32);; 
print_string("\n");; 

的錯誤是:文件 「./test.ml」,第3行,字符24-33: 錯誤:此表達式具有int類型但預期類型 單元

+1

提示:我爲Reason項目提出了一個問題,試圖改善這個錯誤,因爲坦率地說,這種情況的錯誤信息是絕對可怕的。如果錯誤得到改善,它會首先觸發Reason/BuckleScript,但是希望整個錯誤改進項目最終會被OCaml正確地應用。無論如何,請參閱https://github.com/reasonml-community/error-message-improvement/issues/30 – glennsl

回答

4
的表達

unite函數中最後的if沒有else部分。您需要int類型的else部分以匹配該函數的其餘部分。或者,由於您的兩項測試是詳盡且互相排斥的,您實際上可以不用第二個if。這將是一個更加整潔的解決方案。

if x < 5 then 
    (* x is less than 5 in this branch *) 
else 
    (* x is >= 5 in this branch *) 
+0

謝謝,這是問題所在! – Skysork

+0

@Skysork你能接受這個答案嗎? – PieOhPah

相關問題