为什么Haskell的“flip id”有这种types?

我很好奇expressionflip id (这不是作业:我在getOpt文档中find它)。

我想知道为什么它有这种types:

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

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

我知道为什么id (+6) 5给了11,但是我不能“得到” flip id东西。

我试图用笔和纸自己弄清楚,但不能。 有人可以向我解释这个吗? 我的意思是, flip id如何具有typesb -> (b -> c) -> c

id函数有这样的types:

 id :: a -> a 

你得到这种types的一个实例,当你用a -> breplace时:

 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是一样的,只是一个更受限制的types:

 ($) :: (a -> b) -> a -> b ($) fx = fx -- unpoint: ($) f = f -- hence: ($) = id