从列表中过滤出空列表

时间:2011-08-24 18:41:49

标签: haskell-platform haskell

考虑清单

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

1 个答案:

答案 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, []]'

带有错误的表达式的更多上下文,这是我们最终可以发现问题的地方:由于列表具有同源类型,给定123类型Num a => a,和[]类型的[a],统一那些获取Num [a] => [a],导致错误。这种情况下的修复就是我上面所说的,[[12], [3], []]具有(正确的)类型Num a => [[a]]