gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:56:15 24 4
gpt4 key购买 nike

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

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

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

最佳答案

由于您的类型签名错误,您收到错误,您应该使用元组而不是 a 的函数和 b论据:

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

另外,请注意我添加到 uncurry' 的括号s 类型,这些在这种情况下很重要。你所拥有的相当于
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 .

关于haskell - 你如何在 Haskell 中定义和使用 curry 和 uncurry(Prelude 函数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27554272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com