1

考虑清单

  [[],[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, []]
4

1 回答 1

16

您的功能看起来不错,但是:

myfilter [12, 3, []]

...是类型错误。列表包含同类类型的值,而您在此处放置了数字和一个空列表。

我希望你想要的是[[12], [3], []]相反的。

在 GHCi 中:

> myfilter [[12], [3], []]
[[12],[3]]

...这似乎正是您想要的。


为了将来,参考,你得到的错误的翻译键:

No instance for (Num [a])

这意味着它尝试找到Numtype 的实例,但失败了[a]。我们不希望该实例存在,因此问题出在其他地方。

arising from the literal `3' at <interactive>:1:13

Num类型类 contains 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和类型,它是统一的,导致错误。这种情况下的修复就是我上面所说的,并且具有(正确的)类型。3Num a => a[][a]Num [a] => [a][[12], [3], []]Num a => [[a]]

于 2011-08-24T18:50:31.407 回答