gpt4 book ai didi

haskell - 未curried函数的正确类型签名

转载 作者:行者123 更新时间:2023-12-04 22:11:58 25 4
gpt4 key购买 nike

我正在学习 Haskell 中函数的 currying 和 uncurrying。
如果我有这个代码:

fc :: Num a =>  a ->  a ->  a -- curried function
fc x y = x + y

fu :: Num a => (a, a) -> a --uncurried function
fu (x,y) = fc x y

uncurry' :: Num a => (a -> a -> a) -> Num a => (a, a) -> a
uncurry' f(x,y) = f x y

main = print(uncurry' fc 4 5)

编译器提示以下错误:

"Illegal polymorphic or qualified type: Num a => (a, a) -> a".


uncurry' 的正确类型签名是什么? ?

最佳答案

您只需要对类型签名进行一个约束:

uncurry' :: Num a => (a -> a -> a) -> (a, a) -> a
uncurry' f (x, y) = f x y

您不必在类型签名的中间添加额外的约束,Haskell 不喜欢这样。所有约束都在 => 之前,并且只有一个应该出现在类型签名中(直到您启用某些编译器扩展,但这超出了此答案的范围)。

但是,正如 jamshidh 指出的那样,您可以使此签名更通用:
uncurry' :: (a -> b -> c) -> (a, b) -> c

它仍然可以正常工作。请记住,您始终可以强制签名从更通用变为更不通用。

关于haskell - 未curried函数的正确类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27496881/

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