为什么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 -> b
replace时:
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