2016-02-22 94 views
0

我試圖解密calc函數的返回,但是我很困惑。 我有f函數需要3個整數並返回一個int。 我認爲計算函數應該返回val calc : int -> int = <fun>,因爲f必須要3個整數,我給它x和y,所以現在需要一個返回另一個int,最終結果。爲什麼這個邏輯不正確? 我無法理解實際的輸出,特別是當我強迫f中的參數爲整數時的polymorfic值。在OCaml中解密函數返回

# let f (x : int) (y : int) (z : int) = x + y + z;; 
val f : int -> int -> int -> int = <fun> 
# let calc x y f = f x y;; 
val calc : 'a -> 'b -> ('a -> 'b -> 'c) -> 'c = <fun> 
+0

這個等價的代碼如何處理這個等價的代碼:'f(x:int)(y:int)(z:int)= x + y + z let calc x y g = g x y'? calc定義中的參數f(這裏是g)創建一個新的綁定,它會隱藏之前聲明的f。他們沒有共同之處。 –

回答

1

在表達式let calc x y f = f x y;;f是一個本地綁定變量(calc結合xy然後f),而不是之前已定義的功能。

如果你寫了let calc x y = f x y;;那麼你會得到預期的結果。

+0

現在有道理,謝謝。讓我看看我是否得到了正確的計算邏輯。它需要一些,一些b和一些函數,它們會使前面的a和b輸出一些東西,'c反過來就是calc的返回。這是正確的嗎? –

+0

這的確如此。 :) – gallais

1

函數calc不包含對函數f的引用。有一個名爲f的參數,可以將其命名爲g而不更改任何內容:let calc x y g = g x y。如果你想使用f你在上面,而不是正確類型的任何函數定義的函數,你不能傳遞f作爲參數,你應該重寫calc這樣的:

let f x y z = x + y + z 
let calc x y = f x y 

,然後calc將有鍵入int -> int -> (int -> int),這通常寫爲int -> int -> int -> int