为什么Haskell的“翻转id”有这种类型?

时间:2012-09-09 14:14:44

标签: haskell

我对表达式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

1 个答案:

答案 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