2011-11-13 5 views
5

で縛られた堅いタイプの変数です。問題は、スタックオーバーフローで報告されたエラーの数が多いため、解決策のどれも私の問題に適用されないようです。ハスケル私のタイプが指定されていないにもかかわらず、私はこのエラーを受け取ります: `a 'と` [a]'をマッチさせることができませんでした、 `a 'は

だから私は、次の機能があります:あなたはそれが99 Haskell Problemsから問題3です迷っている場合は

elementAt' :: Integral b => [a] -> b -> a 
elementAt' [x:_] 1 = x 
elementAt' [x:xs] y = elementAt' xs yminus1 
    where yminus1 = y - 1 

を。この関数の目的は、リストとインデックスを入力として取り、そのインデックスの値を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分待たなければなりません)。

+0

なぜ、「elementAt」[x:xs] y = elementAt 'xs(y-1) ''と書くのですか? –

+0

@Vixen変数の宣言を含める以外はどうやって書きましたか?コンパイラはどちらの場合もまったく同じことを行うことになります(私が間違っていれば私を修正してください)。 – Asaf

+0

はい、それはあなたが解決策を理解しますが、アスカーはないかもしれ –

答えて

3

あなたは頭と尾にリストに一致する場合は、あなたがそう

elementAt' (x:_) 1 = x 

を使用する必要があり、最終的には

elementAt' :: Integral b => [a] -> b -> a 
elementAt' (x:_) 1 = x 
elementAt' (x:xs) y = elementAt' xs yminus1 
    where yminus1 = y - 1 

そして

λ> elementAt' [1,2,3] 2 
2 

それは何が必要ですか?

1

使用括弧ではなく、ブラケット:(x:xs)

module Aaa where 

elementAt' (x:_) 1 = x 
elementAt' (x:xs) y = elementAt' xs yminus1 
    where yminus1 = y - 1 
+0

Y-1は、より簡単に読み、私の意見 –

+0

@delnanは、上記の説明を行いました。一般的に私はより詳細な答えを出そうとしています。問題の原因を説明するだけではなく、エラーが離れて行く作るため – nponeccop

9

は型宣言せずに、あなたの定義を入力する推論された型がIntegral b => [[a]] -> b -> aであることを示しています。それは正しいです、あなたの現在のパターンはリストのリストと一致します。

​​

よう

パターンは、その唯一の要素patと一致するシングルトンリストに一致します。あなたは(:)別名の代わりに、一定の長さをrequring consで仕事をしたい、とあなたが代わりに括弧の括弧が必要になります。

elementAt' (x:xs) n = ... 

エラー基本的にあなたがa(最初の引数の要素)の治療」と言うことかのようにリストでした "。

+1

+1。 –

3

But in my case I'm not even providing a type for variable a. It should be able to be ANYTHING, right?

これは何でもかまいません。あなたのタイプの署名によると、あなたの関数の使用者はa[Char]さまたは `A'は、ユーザーが望んでいる他のどんなもので、aIntことで、あなたの関数を呼び出すことができなければなりません。エラーメッセージは、それがaが何かのリストであることと、それを呼び出すためにのみ可能だように、あなたの関数を定義したことを語っているが

。私。あなたが定義したので、最初の引数はリストのリストでなければなりません - それは他のもののリストであってはなりません。それはあなたの型名と矛盾します。

関連する問題