Prelude
函数flip
的类型为:
flip :: (a -> b -> c) -> b -> a -> c
即,它需要一个二元函数和两个参数。
Prelude
函数id
的类型为:
id :: a -> a
但flip id
的类型是:
flip id :: a -> (a -> b) -> b
当flip
是一元函数且id
需要第一个arg的二元函数时,如何将id
应用于flip
?
顺便说一句。 flip id
与\ x f -> f x
答案 0 :(得分:15)
通过设置id
,Haskell使flip
符合a = b -> c
的第一个参数的类型。所以:
flip :: ( a -> b -> c) -> b -> a -> c
flip :: ((b -> c) -> b -> c) -> b -> (b -> c) -> c
flip id :: b -> (b -> c) -> c
其中id
属于
id :: (b -> c) -> b -> c
相当于
id :: (b -> c) -> (b -> c)
即。 id
的专门化,仅适用于一元函数。
编辑:我想我可能会将我的第一行改写为:
Haskell 推导 id
符合flip
的第一个参数的类型,如果 a = b -> c
。
如果有更清楚的话。
答案 1 :(得分:4)
Nefrubyr解释得非常好
另一种(希望)使这更直观的方法是考虑函数应用程序运算符($)
。
($)
是id
的一种特殊形式:
($) :: (a -> b) -> (a -> b)
($) = id
我已经看过定义(#) = flip ($)
,这样你就可以在它应用于obj # show
的函数之前编写参数。
显然,由于($)
只是id
的一种特殊形式,您还可以写:(#) = flip id