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])

これはNum、タイプの のインスタンスを見つけようとして失敗したことを意味します[a]。そのインスタンスが存在するとは想定していないため、問題は別の場所にあります。

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

Num型クラスには、数値リテラルなどを特定の型にfromInteger変換するために使用される が含まれています。3つまり、これが示すことは3、 type の何かが期待されるコンテキストで見つかり、それ[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, []]'

エラーのある式の詳細なコンテキスト。これが最終的に問題を特定できる場所です。リストには同種の型、 given 123type Num a => a、および[]typeがあるため、[a]それらが get に統合されNum [a] => [a]、エラーが発生します。この場合の修正は、私が上で言ったことで[[12], [3], []]あり、(正しい) typeを持っていますNum a => [[a]]

于 2011-08-24T18:50:31.407 に答える