我目前正在經歷一些中期練習題,但我似乎被困在識別這個函數的類型,通過它走過(甚至不知道從哪裏開始)。OCaml - 識別此功能的類型
let compose f g = (fun x -> (f (g x)))
任何幫助/指導在正確的方向將不勝感激,謝謝。
我目前正在經歷一些中期練習題,但我似乎被困在識別這個函數的類型,通過它走過(甚至不知道從哪裏開始)。OCaml - 識別此功能的類型
let compose f g = (fun x -> (f (g x)))
任何幫助/指導在正確的方向將不勝感激,謝謝。
的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
因此函數的定義是:
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。
如果我的解釋混淆你只是讓我知道,我會嘗試澄清。
感謝您抽出寶貴時間回答時,我發現它有助於作爲對其他答案的補充,因爲我正在尋找一個向前移動的答案而不是向後的答案。 – user2789945 2015-04-06 01:32:56
感謝您花時間回答,我非常感謝,並且它的結構與我所尋找的完全一樣。然而,讓我失望的句子是:所以,返回值是一個接受名爲x的類型'e'的值的函數。你不是故意的嗎? – user2789945 2015-04-06 01:30:32