你如何在Haskell中定义和使用curry和uncurry(Prelude函数)?

时间:2014-12-18 19:32:11

标签: haskell currying

如何在Haskell中使用curryuncurry前奏函数?

此外,为什么以下定义在加载时会抛出错误?

curry' :: ((a -> b) -> c) -> a -> b -> c
curry' f = \x y -> f (x, y)

uncurry' :: a -> b -> c -> ((a -> b) -> c)
uncurry' f = \(x,y) -> f x y

1 个答案:

答案 0 :(得分:9)

您收到错误是因为您的类型签名错误,您应该使用元组而不是ab参数的函数:

curry' :: ((a, b) -> c) -> a -> b -> c
uncurry' :: (a -> b -> c) -> ((a, b) -> c)

另外,请注意我添加到uncurry'类型的括号,在这种情况下这些是很重要的。你所拥有的相当于

uncurry' :: a -> (b -> (c -> ((a -> b) -> c)))

这是不一样的,这是一个函数,它接受3个参数并产生一个函数,而不是一个带有2参数函数的函数,并返回一个元组参数的函数。

您可以使用

这些功能
> uncurry (+) (1, 2)
3
> curry fst 1 2
1
> curry snd 1 2
2

(我没有看到任何以元组为参数的其他Prelude函数)

编辑:在chi的要求下,这是对最后一句话的更直观的解释:

a -> (b -> (c -> ((a, b) -> c)))

是一个函数的类型,它接受3个参数abc,并返回类型为(a, b) -> c的函数。

(a -> b -> c) -> ((a, b) -> c)

是一个函数的类型,它接受一个参数a -> b -> c并返回一个函数(a, b) -> c