エラーが発生します:
No instance for (Integral [t0])
この Haskell コードを実行すると。
boomBangs xs = [(a,b,c) |a<-[1..xs],b<-[1..xs],c<-[1..xs], xs <- xs `div` 2]
どこが間違っていますか?
エラーが発生します:
No instance for (Integral [t0])
この Haskell コードを実行すると。
boomBangs xs = [(a,b,c) |a<-[1..xs],b<-[1..xs],c<-[1..xs], xs <- xs `div` 2]
どこが間違っていますか?
問題は、リストを分割しようとしていることです。特に、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]
i
Integral
あなたが言ったことは:
a
、b
、およびのタプルを教えてくださいc
:[ (a, b, c)
a
、b
、およびからまでc
の値のリスト内の各:1
xs1
| a <- [1..xs1] , b <- [1..xs1] , c <- [1..xs1]
と 2
xs2
の商のそれぞれについて。xs1
, xs2 <- xs1 `div` 2 ]
警告を有効にしてコンパイルする ( -Wall
) か、GHCiで警告を有効にする ( ) と、 inが in を隠し、未使用で:set -Wall
あるという警告が表示されます。明らかに、この種の警告は問題を正しく示しているため、非常に役立ちます。xs
xs <- ...
xs
boomBangs 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]
]