ハスケルを初めて使う人です。私はこのコードを書いた:コンテキスト(...)から推論できません(...)
deleteDuplicates :: [a] -> [a]
deleteDuplicates [] = []
deleteDuplicates (x:xs)
| x == (head xs) = x : (deleteDuplicates (tail xs))
| otherwise = x : (head xs) : (deleteDuplicates (tail xs))
このエラーは何を意味し、なぜそれが起こったのですか?何とか2つの異なるタイプを誤って比較していますか?
set2.hs:10:3:
Could not deduce (Eq a) from the context()
arising from a use of `==' at set2.hs:10:3-16
Possible fix:
add (Eq a) to the context of
the type signature for `deleteDuplicates'
In the expression: x == (head xs)
In a stmt of a pattern guard for
the definition of `deleteDuplicates':
x == (head xs)
In the definition of `deleteDuplicates':
deleteDuplicates (x : xs)
| x == (head xs) = x : (deleteDuplicates (tail xs))
| otherwise = x : (head xs) : (deleteDuplicates (tail xs))
'[1、2、2、3]'のようなものについては、すべての重複が削除されたリストを作成できません。私の悪い。 'Eq a =>'のことは私には新しかったので、 'a'型の要素は比較可能でなければならないのですか? – Pieter
Pieter:基本的にはい。これは「typeclass制約」です。 '=='関数は 'Eq'型クラスで宣言されているので、式のインスタンスに対してのみ使用できます。 –
@Pieter:平等に匹敵する、はい。 'Eq a =>'は 'a'は型クラス' Eq'のインスタンスでなければならないと言っています。型クラスは、インスタンスが実装するインタフェースを指定します。'Eq'クラスは二つの関数'(==) 'と'(/ =) 'を提供します。どちらも型' a - > a - > Bool'です。他の型クラスは他の関数を提供します。例えば、 'Ord'はより小さい、より大きい、より大きい、類似の順序付けテストを提供します。 –