2016-08-15 89 views
1

我完全失去了對這個。有人解釋說,功能是正確的,所以let add x y = x + y;;有一個函數類型int -> int -> intint -> (int -> int)OCaml的 - 給類型的函數(INT - > INT) - > INT

我不知道我怎麼會定義(int -> int) -> int類型的函數。我想我會有第一個參數是一個函數,通過int並返回int。我已經試過:

let add = fun x y -> x + y --- int -> int -> int

let add = fun f x = (f x) + 3 --- ('a -> int) -> 'a -> int

+0

類型add'的'是正常的:'F'可以,只要它返回一個'int'能夠執行加法帶走任何東西。例如'add int_of_string「2」'是有效的。編譯器生成最常用的類型,並且沒有任何限制'x'的類型。如果你寫了'let add f x = f(x + 1)+ 3',那將是不同的。 – ChriS

回答

2

什麼

let eval (f: int -> int) :int = f 0 

+0

對不起,我還沒有學過這種定義函數的方法。有沒有辦法做到這一點沒有冒號? – stumped

+3

冒號用於註釋某種類型的東西,通常只對人類讀者有用。你可以省略類型註釋:'let eval f = f 0 + 0' –

0
fun x -> (x 1) + 1;; 
- : (int -> int) -> int = <fun> 

let foo f = (f 1) + 1;; 
val foo : (int -> int) -> int = <fun> 

它就像

foo (fun x -> x + 1);; 
- : int = 3 
0

您的問題是高度的Currying概念相聯繫。

但在此之前,讓我說,如果你要編寫需要一個參數是一個函數的函數,你可以聲明一個正常的功能,只需使用其參數的功能等。沒有必要使它複雜化。參見例如:

let f x = x(10) + 10 

現在來了咖喱部分。在OCaml中,參數在語義上每次只評估一個參數,在評估一個參數之後,返回一個匿名函數。這很重要,因爲它可以讓你提供函數的部分參數,有效地創建一個新函數(稱爲部分應用程序)。

在下面的示例中,我使用+作爲函數(運算符周圍的括號將其轉換爲正常函數),以創建增量函數。並將其應用於之前的f函數。

let incr = (+) 1 
f incr 

的代碼評估爲f incr = incr(10) + 10 = 21

link有適用於OCaml的更多相關信息。

相關問題