gpt4 book ai didi

haskell - 使用foldl with++ 时约束错误中的非类型变量参数

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

我正在尝试将折叠与++ 一起使用。当我检查它的类型时它应该可以工作:

> :t foldl (++)
foldl (++) :: Foldable t => [a] -> t [a] -> [a]

当我尝试像这样使用它时

> foldl (++) [1] [1,2,3]

我收到如下错误:

Non type-variable argument in the constraint: Num [a] (Use FlexibleContexts to permit this)

我做错了什么?

最佳答案

我认为您误解了 foldl (++) 函数的类型,t 在这里很重要:

foldl (++) :: <b>Foldable t</b> => [a] -> <b>t</b> [a] -> [a]

如果您传递 [1]::Num n => [n] 作为第一个参数,那不是问题,因为从那时起您的 [1] 作为输入 [a],即 a ~ n

然而,第二个参数一个问题。您在这里传递一个列表 [1,2,3]::Num m => [m],类型为 Num m => [m],或更规范数字 m => [] m。让其与 t [a] 匹配的唯一可能方法是设置 t ~ [] (t 是列表 type 构造函数),然后 [a] 应该与 m 匹配,但 Haskell 不知道 Num 类型 m 是一个列表 [a],因此失败。

您可以这样调用:

Prelude> foldl (++) [1] <b>[</b>[2], [3,4]<b>]</b>
[1,2,3,4]

因为 Haskell 这里会生成一个如下所示的表达式:

(([1] ++ [2]) ++ [3]) ++ [4]

这相当于:

[1,2,3,4]

我们还可以传递其他 Foldable 类型,例如 Maybe:

Prelude> foldl (++) [1] (<b>Just</b> [2])
[1,2]
Prelude> foldl (++) [1] <b>Nothing</b>
[1]

在这种情况下,第二个参数的类型应为也许 [Int]

关于haskell - 使用foldl with++ 时约束错误中的非类型变量参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56227392/

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