gpt4 book ai didi

haskell - 对 Num 和 Char 值使用 Haskell 加法函数

转载 作者:行者123 更新时间:2023-12-02 07:05:30 25 4
gpt4 key购买 nike

我在使用以下函数时遇到问题

sum f l1 l2 = (f l1) + (f l2)

它不适用于总长度[1,2] ['a','b']。当我尝试这个时,我得到了

No instance for (Num Char) arising from the literal ‘1’ 

错误,所以问题出在类型上。当我尝试 :t 函数时,我得到 sum::Num a => (t -> a) -> t -> t -> a。因此,如果我理解正确,我不能同时使用 + 函数来处理数字和字符值,但我缺乏对为什么会出现这种情况以及如何修复的更深入的理解它。

我尝试了一些方法,例如使用 let 作为文字之一或 id 函数,但这似乎不起作用。有什么帮助吗?

最佳答案

当从代码中推断类型时,GHC 会假设您希望 f 有一个相对简单的类型,并希望 l1l2具有相同的类型,以便两者都适合作为 f 的输入。

您显然想要传递一个多态的 f,它可以在 [Int][Char] 上工作。根据您想要获得的通用程度,这里有一些选项:

适用于列表,f 必须适用于任何列表,无论元素类型如何:

sum0 :: (forall x. [x] -> Int) -> [a] -> [b] -> Int
sum0 f l1 l2 = f l1 + f l2

适用于列表和其他Foldable类型(向量、集合、矩阵),只要两个输入是相同的Foldable。第一个参数可以是 length,或者特定于 Foldable 选择的参数,例如 Set.size

sum1 :: (Num n, Foldable f) => (forall x. f x -> n) -> f a -> f b -> n
sum1 f l1 l2 = f l1 + f l2

允许l1l2不同Foldable类型。 f 必须适用于任何可折叠设备。 length 仍然符合条件,但 Set.size 不够通用。

sum2 :: (Num n, Foldable s, Foldable t) => (forall f x. Foldable f => f x -> n) -> s a -> t b -> n
sum2 f l1 l2 = f l1 + f l2

实际上,对于这么小的函数,我认为在每个使用站点编写 length l1 + length l2 比定义具有上述任何复杂类型的函数更容易。但很高兴知道我们可以在需要时编写这些类型。

关于haskell - 对 Num 和 Char 值使用 Haskell 加法函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53487566/

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