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

Nic*_* M. 41 haskell

我对表达很好奇flip id(这不是作业:我在getOpt文档中找到了它).

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

Prelude> :t (flip id)
(flip id) :: b -> (b -> c) -> c
Run Code Online (Sandbox Code Playgroud)

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

我知道为什么id (+6) 5给11,但我不"得到"的flip id东西.

我试图用笔和纸来解决这个问题但不能.有人可以向我解释一下吗?我的意思是,怎么样flip id的类型b -> (b -> c) -> c

小智 70

id函数具有以下类型:

id :: a -> a
Run Code Online (Sandbox Code Playgroud)

当您替换aa -> b:时,您将获得此类型的实例:

id :: (a -> b) -> (a -> b)
Run Code Online (Sandbox Code Playgroud)

由于currying,它与以下相同:

id :: (a -> b) -> a -> b
Run Code Online (Sandbox Code Playgroud)

现在申请flip这个,你得到:

flip id :: a -> (a -> b) -> b
Run Code Online (Sandbox Code Playgroud)

id (+)实例的情况下是:

id :: (Num a) => (a -> a) -> (a -> a)
Run Code Online (Sandbox Code Playgroud)

现在flip id给你:

flip id :: (Num a) => a -> (a -> a) -> a
Run Code Online (Sandbox Code Playgroud)

旁注:这也向您展示了如何($)相同id,只是使用更受限制的类型:

($) :: (a -> b) -> a -> b
($) f x = f x
-- unpoint:
($) f   = f
-- hence:
($)     = id
Run Code Online (Sandbox Code Playgroud)

  • 嘿,ertes,你似乎有[另一个账号](http://stackoverflow.com/users/1488832/ertes),两者都是未注册的.如果您注册帐户,可以[合并](http://meta.stackexchange.com/questions/18232/how-can-one-link-merge-combine-associate-two-accounts-users-anonymous-unregist )然后为你的所有答案都有一个帐户(顺便说一句,这真的很棒!). (12认同)
  • 很好的答案.将"翻转id"视为"翻转($)"有很多帮助. (3认同)
  • 谢谢,很好的答案。您提到的“$”让理解起来更直观,我很高兴您没有遗漏它。我的大脑还需要几天时间才能完全理解您的答案。 (2认同)