10

Prelude函数的类型flip是:

flip :: (a -> b -> c) -> b -> a -> c

即,它需要一个二进制函数和两个参数。

Prelude函数的类型id是:

id :: a -> a

但类型flip id是:

flip id :: a -> (a -> b) -> b

如何适用flipidwhenid是一元函数并且flip第一个 arg 需要二元函数的情况?

顺便提一句。flip id类似于\ x f -> f x

4

2 回答 2

15

Haskell通过设置id来适应第一个参数的类型。所以:flipa = b -> c

flip :: ( a       -> b -> c) -> b ->  a       -> c
flip :: ((b -> c) -> b -> c) -> b -> (b -> c) -> c
flip id ::                      b -> (b -> c) -> c

whereid被认为是类型

id :: (b -> c) ->  b -> c

这相当于

id :: (b -> c) -> (b -> c)

即,它的专门化id仅适用于一元函数。

编辑:我想我可以将我的第一行改写为:
Haskell推断出符合idif 的第一个参数的flip 类型 a = b -> c
以防万一更清楚。

于 2009-11-11T14:23:06.730 回答
4

Nefrubyr 很好地解释了这一点。
另一种(希望)使其更直观的方法是考虑函数应用运算符($)

($)是 的一种特殊形式id

($) :: (a -> b) -> (a -> b)
($) = id

我已经看到了定义(#) = flip ($),这样您就可以在函数应用于:之前编写参数obj # show

显然,因为($)它只是 的一种特殊形式id,你也可以这样写:(#) = flip id

于 2009-11-11T14:35:19.263 回答