2016-11-06 54 views
1

一個練習問題要求解釋爲什麼這不起作用。顯然,從運行代碼我發現它沒有,但我沒有看到在這種情況下爲什麼。這個錯誤並沒有說明太多!OCaml重新定義中綴運算符

# let (+) x y z = x + y + z in 5 + 6 7;; 
Error: This expression has type int 
    This is not a function; it cannot be applied. 

謝謝!

回答

4

讓我們一步一步來。火REPL和類型:

# let (+) x y z = x + y + z;; 
val (+) : int -> int -> int -> int = <fun> 

我們可以解釋這個int -> int -> int -> int作爲中綴+運營商,它有兩個int S和返回int -> int功能

讓檢查:

# let f = 5+6;; 
val f : int -> int = <fun> 
# f 7;; 
- : int = 18 

這就是你的預期計劃工作的每一步。
你的代碼的問題是,這不起作用:

# 5+6 7;; 
Error: This expression has type int 
    This is not a function; it cannot be applied. 

這是因爲功能應用已超過+操作者優先。 (事實上​​,功能應用在OCaml中最強的優先級。)因此增加支架,修復它(你需要重啓頂層):

# let (+) x y z = x + y + z in (5+6) 7;; 
- : int = 18 
+0

所以INT - > INT - > INT - > INT能被讀爲輸入:int - > int和output:int - > int,或(int - > int) - >(int - > int)?也就是說,它的輸入是一個int類型的函數嗎? – Krpcannon

+2

否'int - > int - > int - > int'意味着'int - >(int - >(int - > int))'並且只有那個。雖然'(int - > int) - >(int - > int)'表示一個函數,它接受一個'int-> int'函數並返回一個'int-> int'函數 – Kostya

+0

謝謝@Kostya,這個目標函數根本的誤解 - 簽名值是正確的聯想。 – Krpcannon