我对表达式flip id
感到好奇(这不是作业:我在getOpt
文档中找到了它。)
我想知道为什么会有这种类型:
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
?
答案 0 :(得分:69)
id
函数具有以下类型:
id :: a -> a
当您a
替换a -> b
时,您会收到此类型的实例:
id :: (a -> b) -> (a -> b)
,由于currying,与以下相同:
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