1

エラーが発生します:

No instance for (Integral [t0])この Haskell コードを実行すると。

boomBangs xs = [(a,b,c) |a<-[1..xs],b<-[1..xs],c<-[1..xs], xs <- xs `div` 2]

どこが間違っていますか?

4

2 に答える 2

6

問題は、リストを分割しようとしていることです。特に、xs `div` 2は不適切な表現です。

エラーメッセージからこれを得ることができます:[t0]整数のように振る舞わないことを訴えています (例えば、Integralクラスにありません)。[t0]は単なるリストです。小文字の は、任意t0の型を表す型変数です。

もののリストは数字ではないので、それらを分割する方法を実際に知ることはできません.

のタイプを見ると、この正確なエラー メッセージが表示される理由がわかりますdiv

div :: Integral i => i -> i -> i

iこれが意味することは、クラス内のあるタイプが与えられたIntegral場合、2 つを分割して 3 番目のタイプを得ることができるということです。モノのリストは整数クラスの一部ではないため、それらを分割することはできず、エラーが発生します。

divのような具象型がある場合、期待される型と実際の型がdiv :: Int -> Int -> Int一致しないことを示すエラーが表示されます。ただし、型には実際には変数が含まれているため、エラーはもう少し複雑です。クラスにないため、代わりに使用する有効な型にすることはできません。Int[t0]i[t0]iIntegral

于 2013-05-25T05:07:44.847 に答える
6

あなたが言ったことは:

ab、およびのタプルを教えてくださいc:

[ (a, b, c)

ab、およびからまでcの値のリスト内の各:1xs1

| a <- [1..xs1]
, b <- [1..xs1]
, c <- [1..xs1]

と 2xs2の商のそれぞれについて。xs1

, xs2 <- xs1 `div` 2
]

警告を有効にしてコンパイルする ( -Wall) か、GHCiで警告を有効にする ( ) と、 inが in を隠し、未使用で:set -Wallあるという警告が表示されます。明らかに、この種の警告は問題を正しく示しているため、非常に役立ちます。xsxs <- ...xsboomBangs xs = ...

は関数への入力であるためxs1、次のような型になります。

(Integral [t]) => [t] -> [([t], [t], [t])]

つまり、この関数はxs1、数値 ( (`div` 2)) として機能するリスト ( ) を受け取り、そのようなリストのタプルのリストを返します。リストを数値で除算しようとしても、リストのインスタンスを定義できたので、GHC はそれを許可し、より一般的な型を推測します。実際に具象型で関数を使用Integralしようとしたときに、そうでないことがわかります。型のシグネチャを書き留めておくと、コンパイラの基盤を維持し、より適切なエラー メッセージを表示するのに役立ちます。

私はあなたが次boomBangsのようなタイプを持つことを意図していたと推測することができます:

Integral t => [t] -> [(t, t, t)]

あるいは単に:

[Int] -> [(Int, Int, Int)]

その場合、おそらく次のようなことを考えていました。

[ (a, b, c)
| x <- xs
, a <- [1..x `div` 2]
, b <- [1..x `div` 2]
, c <- [1..x `div` 2]
]
于 2013-05-25T05:19:45.650 に答える