我对表达很好奇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)
当您替换a为a -> 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)