49

我对这个表达很好奇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

4

1 回答 1

78

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)

Now flip id gives you:

flip id :: (Num a) => a -> (a -> a) -> a

Side note: This also shows you how ($) is the same as id, just with a more restricted type:

($) :: (a -> b) -> a -> b
($) f x = f x
-- unpoint:
($) f   = f
-- hence:
($)     = id
于 2012-09-09T14:22:49.350 回答