だから、スタックオーバーフローでこれらのエラーが報告されているので、これは重複する可能性のある質問ですが、解決策のどれも私の問題には当てはまりません。
だから私は次の機能を持っています:
elementAt' :: Integral b => [a] -> b -> a
elementAt' [x:_] 1 = x
elementAt' [x:xs] y = elementAt' xs yminus1
where yminus1 = y - 1
あなたが
99ハスケル問題の問題3であると思っている場合に備えて。この関数の目的は、リストとインデックスを入力として取り、そのインデックスの値を1から始めることです。私は問題に解決策を望んでいません、私が提供したものを見れば分かります。しかし、私は理解していないエラーが発生しています。私はeclipseFP、haskellのEclipseプラグインを使用しています。関数の
“[x:_]”と “[x:xs]”部分に下線を引いています。
Couldn't match type `a' with `[a]'
`a' is a rigid type variable bound by
the type signature for elementAt' :: Integral b => [a] -> b -> a
私がこの問題を見てきたこのエラーを論じているすべてのスレッドでは、通常、あるタイプを予期しているものに間違った出力を出そうとしたときに発生します。たとえば、何らかの型(Int型)の長さを
“Num a”型にする必要があります。
しかし私の場合、私は変数aの型を提供していません。それは何か、右かもしれないはずですか?では、なぜこのエラーが発生していますか?なぜ私がエラーを起こしているのか理解したら、修正することができましたが、分かりません。
誰かが私にこのエラーを受け取っている理由を説明してもらえますか?
あなたの助けが大変ありがとうございます。 -Asaf
編集:これまでに提供されたすべての回答が正しいです、あなたに役立つ情報をありがとうございました。私は、私が最も明確であると信じているものを選ぶつもりです(私はそれを行うには5分待たなければなりません)。
Entering your definition without type declaration shows that the
inferred type is Integral b => [[a]] -> b ->
. That’s correct, your current patterns match lists of
a
lists.
のようなパターン
f [pat] = ...
唯一の要素が pat
と一致するシングルトンリストに一致します。特定の長さを要求するのではなく、
cons
a.k.a.
(:)
で作業したい場合、角括弧の代わりにかっこが必要です。
elementAt' (x:xs) n = ...
エラーは、基本的に “あなたが a
(最初の引数の要素)をリストのように扱います”と言います。