如何在Haskell中使用curry
和uncurry
前奏函数?
此外,为什么以下定义在加载时会抛出错误?
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
答案 0 :(得分:9)
您收到错误是因为您的类型签名错误,您应该使用元组而不是a
和b
参数的函数:
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个参数a
,b
和c
,并返回类型为(a, b) -> c
的函数。
(a -> b -> c) -> ((a, b) -> c)
是一个函数的类型,它接受一个参数a -> b -> c
并返回一个函数(a, b) -> c
。