2011-10-15 66 views
4

我試圖通過Jason Hickey筆記教自己OCaml,下面的練習讓我難住了。 問題:編寫函數總和給出兩個整數範圍 m,n和函數 f計算總和。 我想這一點:簡單的OCaml練習

 let rec sum m n f= 
    if m>n then 0 
    else if m=n then f n 
    else f m + sum n m+1 f 

,但它不工作,產生了錯誤類型。

+0

什麼是類型錯誤? –

+0

類型錯誤_ sum n m_'錯誤:該表達式具有類型('a - > int) - >'b但是表達式期望爲int類型'。我已經得到了答案,但我想如果我更仔細地閱讀這個問題,我有機會自己弄清楚。 – Torus

回答

7

你需要一些括號。

let rec sum m n f= 
    if m>n then 0 
    else if m=n then f n 
    else f m + sum n (m+1) f 

(雖然可讀性,我通常會加上括號中的最後一行的其他(f m) + (sum n (m+1) f)。) 發生了什麼事沒有括號是,它把它當作(f m) + (sum n m) + (1 f)其正在生產sum n m沒有int類型的錯誤,因爲它是一個更復雜類型的部分功能應用程序。

作爲一般規則,當表達式作爲參數傳遞給函數時,它總是需要加括號。在相關說明中,如果您真的想要將加號函數作爲參數傳遞,您可以將其放在括號內(例如:sum m n (+)(儘管在這種情況下不會鍵入check,因爲+需要兩個數字))。

6

函數應用程序(函數名稱與其參數的綁定)在OCaml中具有最高的優先級。所以,你需要看你的括號。我沒有給出解決方案,因爲自己弄清楚它可能更有趣。

+0

謝謝。這兩個答案都很有啓發性。我首先接受了第一個答案。 – Torus