2015-04-06 88 views
0

我目前正在經歷一些中期練習題,但我似乎被困在識別這個函數的類型,通過它走過(甚至不知道從哪裏開始)。OCaml - 識別此功能的類型

let compose f g = (fun x -> (f (g x))) 

任何幫助/指導在正確的方向將不勝感激,謝謝。

回答

2

compose函數有兩個參數,所以它應該有類型:

'a -> 'b -> 'c 

(這'a'b'c是類型變量,只是一個佔位符,我們會細化他們在推導過程)。

此類型表示:相應地採用'a'b類型的參數並返回'c類型的值。

讓我們往前走,我們看到了一個參數的函數=的右側,這意味着'c必須是一個箭頭型也:

'a -> 'b -> ('d -> 'e) 

因此,返回值是一個函數它接受名爲x的類型爲'd的值。但是,我們可以看到,g功能也被應用到這個值,這意味着,我們的原函數的第二個參數,即有鍵入'b實際上必須是一個函數,接受'd類型也值:

'a -> ('d -> 'f) -> ('d -> 'e) 

接下來我們看到,類型爲'a的第一個參數f也適用於任何g返回的函數。這意味着它必須是一個接受'f並返回一些值的函數。但由於功能f的返回值是compose函數的返回值,這意味着它應該返回'e,所以

('f -> 'e) -> ('d -> 'f) -> ('d -> 'e) 

現在,讓我們進行重命名,以使它看起來更好:

('a -> 'b) -> ('c -> 'a) -> ('c -> 'b) 

最後,由於->聯營權,我們可以去掉最後兩個括號:

('a -> 'b) -> ('c -> 'a) -> 'c -> 'b 
+0

感謝您花時間回答,我非常感謝,並且它的結構與我所尋找的完全一樣。然而,讓我失望的句子是:所以,返回值是一個接受名爲x的類型'e'的值的函數。你不是故意的嗎? – user2789945 2015-04-06 01:30:32

1

因此函數的定義是:

val compose : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>

第一套括號:( 'A - >' b)中說,f是一個函數, '和返回的東西' B

第二組圓括號:('c - >'a)表示g是一個函數,它接受'c'類型的東西並返回類型'a'。

最後一部分'c - >'b表示我們返回一個函數,它接受'c'類型的東西並返回'b'。

要知道爲什麼這些類型的分配,我們可以通過查看此開始:

(g x)

所以我們看到,G有適用於它的變量x。所以g必須是一個函數。所以我們可以看看x賦給它一個類型'c。由於x:'c應用於g,g必須以'c'作爲參數並返回一些內容。假設它返回'a。我們也知道應用的表達式(g x)返回類型'a。

接下來讓我們來看看: (f (g x)))

由於(g x):'a被應用到f。所以f也必須是一個函數。由於它被應用了一些'我們現在知道它需要一些類型'a作爲參數。然後我們可以說它返回類型'b'。應用的表達式(f (g x)))返回類型'b。

如果我的解釋混淆你只是讓我知道,我會嘗試澄清。

+0

感謝您抽出寶貴時間回答時,我發現它有助於作爲對其他答案的補充,因爲我正在尋找一個向前移動的答案而不是向後的答案。 – user2789945 2015-04-06 01:32:56