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

use*_*579 3 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
Run Code Online (Sandbox Code Playgroud)

bhe*_*ilr 9

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

curry' :: ((a, b) -> c) -> a -> b -> c
uncurry' :: (a -> b -> c) -> ((a, b) -> c)
Run Code Online (Sandbox Code Playgroud)

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

uncurry' :: a -> (b -> (c -> ((a -> b) -> c)))
Run Code Online (Sandbox Code Playgroud)

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

您可以使用这些功能

> uncurry (+) (1, 2)
3
> curry fst 1 2
1
> curry snd 1 2
2
Run Code Online (Sandbox Code Playgroud)

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

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

a -> (b -> (c -> ((a, b) -> c)))
Run Code Online (Sandbox Code Playgroud)

是3个参数的函数的类型a,b以及c,并返回类型的函数(a, b) -> c.

(a -> b -> c) -> ((a, b) -> c)
Run Code Online (Sandbox Code Playgroud)

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