2012-09-09 25 views
37

我很好奇flip id(這不是作業:我在getOpt文檔中找到它)。爲什麼Haskell的「flip id」有這種類型?

我不知道爲什麼它有這個類型:

Prelude> :t (flip id) 
(flip id) :: b -> (b -> c) -> c 

例如,(flip id) 5 (+6)11

我知道爲什麼id (+6) 5給出11,但我沒有「得到」flip id的東西。

我試圖用筆和紙自己弄清楚,但不能。有誰可以向我解釋這個嗎?我的意思是,flip id怎麼會有b -> (b -> c) -> c

回答

66

id功能有此類型:

id :: a -> a 

你得到這種類型的實例,當你更換a通過a -> b

id :: (a -> b) -> (a -> b) 

其中,因爲討好的,是一樣的:

id :: (a -> b) -> a -> b 

現在申請flip到這一點,你會得到:

flip id :: a -> (a -> b) -> b 

id (+)的情況下的實例是:

id :: (Num a) => (a -> a) -> (a -> a) 

現在flip id爲您提供:

flip id :: (Num a) => a -> (a -> a) -> a 

邊注:這也說明了如何($)id相同,僅限於更受限制的類型:

($) :: (a -> b) -> a -> b 
($) f x = f x 
-- unpoint: 
($) f = f 
-- hence: 
($)  = id 
+11

嘿,ertes,你似乎有[另一個帳戶](http://stackoverflow.com/users/1488832/ertes),兩者都未註冊。如果你註冊你的帳戶,你可以[合併它們](http://meta.stackexchange.com/questions/18232/how-can-one-link-merge-combine-associate-two-accounts-users-anonymous-unregist ),然後有一個單一的帳戶所有的答案(順便說一句,這真的很好!)。 – huon

+0

謝謝,很好的答案。你提到'$'使得它更直觀易懂,我很高興你沒有離開它。這將使我的大腦再過幾天才能完全理解你的答案。 –

+3

很好的答案。將「flip id」想成「flip($)」有很多幫助。 – Garrett