是否可以在`flip`中使用一元函数而不是二元函数?

时间:2009-11-11 14:09:05

标签: haskell functional-programming flip

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

类似

2 个答案:

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