2012-09-09 26 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