2016-11-07 76 views
0

您好!功能類型簽名

我試圖在互聯網上找到這個地方,但我沒有做到這一點。我想學習OCaml,這對我來說很難理解,如何做到這一點。

我的問題是 - 我如何輕鬆寫一個函數,當我有簽名。例如 - 我有這樣的簽名:

((int - > int) - > int - > int - > int) - >(int - > int) - > int - > int - > int

我想要編寫一個函數,它有上面這樣的簽名。有人會幫我解釋一下嗎?我會非常感謝:)

回答

4

函數的類型爲'a -> 'b,取某些類型的值'a並返回某些類型的值'b。要使用特定類型,類型爲int -> int的函數將接受一個int並返回一個int。例如,這是整數否定的類型。

一種方式來看待與'a -> 'b -> 'c類型的函數的方法是,它需要兩個值,'a類型和'b,並返回'c類型的值。一個具體的例子是int -> int -> int的類型,這是整數加法(比如說)的類型:

# (+);; 
- : int -> int -> int = <fun> 

此模式繼續用於多個參數。

您提供的類型在高級別具有此類型:'a -> 'b -> 'c -> 'd -> 'e。所以,這是一個有四個參數的函數。

第一個參數的類型爲(int -> int) -> int -> int -> int,這本身就相當複雜。第二個參數的類型爲int -> int,如上所述。第三個和第四個參數的類型爲int。該函數返回一個int

對第一個參數使用相同的分析,可以看到它是一個帶三個參數的函數。第一個是int -> int類型的函數,第二個和第三個類型是int。該函數返回一個int

這裏的(int -> int) -> int -> int -> int類型的函數:

let myfun f a b = 
    (f a) + a + b 

你可以看到在OCaml的頂層類型:

# let myfun f a b = 
    (f a) + a + b;; 
val myfun : (int -> int) -> int -> int -> int = <fun> 
# 

你應該能夠制定出休息。我不想通過給出完整的答案來解決問題。

+0

感謝您的回答!我不知道我是否理解正確,具有這個長簽名的整個功能,它只會在「myfun」中?我必須申報新的變數或什麼?對不起,這可能是愚蠢的問題,但我嘗試了一些行動,只有val myfun:(int - > int) - > int - > int - > int - > int - > int – Bartek

+0

您需要聲明一個像這樣的函數:'讓myfun2 ghab = ...'。在這個函數裏面,你需要使用上面'myfun'接受的參數來調用'g',並且你需要使用上面'f'接受的參數來調用'h'。編譯器通過查看在代碼中如何使用它們來確定事物的類型。所以你必須以正確的方式使用它們來獲得正確的類型。 –

+0

哦,我做到了!非常感謝!我現在無法贊成你,但我會做到這一點,當我可以:) – Bartek