如何在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
Run Code Online (Sandbox Code Playgroud)
您收到错误是因为您的类型签名错误,您应该使用元组而不是函数a和b参数:
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.
| 归档时间: |
|
| 查看次数: |
6364 次 |
| 最近记录: |