考虑清单
[[],[1],[1,2],[1,2,3],[],[2],[2,3],[],[3],[]]
我想过滤掉所有非空列表的元素,即过滤后的输出应该给我一个结果:
[[1],[1,2],[1,2,3],[2],[2,3],[3]]
以下代码失败:
myfilter lst = filter(\x -> x/=[]) lst
[12,3,[]]
的错误如下 No instance for (Num [a])
arising from the literal `3' at <interactive>:1:13
Possible fix: add an instance declaration for (Num [a])
In the expression: 3
In the first argument of `myfilter', namely `[12, 3, []]'
In the expression: myfilter [12, 3, []]
答案 0 :(得分:16)
你的功能看起来很好,但是这个:
myfilter [12, 3, []]
...是类型错误。列表包含同类型的值,而您在此处放置了数字和空列表。
我希望您想要的是[[12], [3], []]
。
在GHCi中:
> myfilter [[12], [3], []]
[[12],[3]]
......这似乎正是你想要的。
以后,参考,你得到的错误的翻译密钥:
No instance for (Num [a])
这意味着它尝试并失败,为类型Num
找到[a]
的实例。我们不希望这个实例存在,所以问题出在其他地方。
arising from the literal `3' at <interactive>:1:13
Num
类型类包含fromInteger
,用于将3
等数字文字转换为某种特定类型。所以这告诉我们的是,它在一个上下文中找到了3
,它预期某些类型为[a]
,并尝试在其上使用fromInteger
。这导致上面的“无实例”错误。
Possible fix: add an instance declaration for (Num [a])
这句话是无稽之谈。缺少Num
实例导致的错误几乎不会因忘记编写合理的实例声明而引起。
In the expression: 3
这告诉我们发现错误的表达式。不过,我们之前已经提到了文字3
。
In the first argument of `myfilter', namely `[12, 3, []]'
带有错误的表达式的更多上下文,这是我们最终可以发现问题的地方:由于列表具有同源类型,给定12
和3
类型Num a => a
,和[]
类型的[a]
,统一那些获取Num [a] => [a]
,导致错误。这种情况下的修复就是我上面所说的,[[12], [3], []]
具有(正确的)类型Num a => [[a]]
。