2016-11-20 7 views
1

作成したリストタイプのEqインスタンスを作成しようとしています。 Eqは両方のリストの平均値が等しい場合にのみtrueを返さなければなりません。Haskell Eqインスタンスを作成しようとしています

average :: (Real a, Fractional b) => [a] -> b 
average xs 
    | xs == [] = 0 
    | otherwise = realToFrac (sum xs)/genericLength xs 

data NumList a = Nlist [a] 

instance Eq (NumList a) where 
    (Nlist x) == (Nlist y) = (average x) == (average y)` 

しかし、私はこれをコンパイルしようとすると、私はエラーを取得:

No instance for (Real a) arising from a use of ‘average’ 
Possible fix: 
    add (Real a) to the context of the instance declaration 
In the first argument of ‘(==)’, namely ‘(average x)’ 
In the expression: (average x) == (average y) 
In an equation for ‘==’: 
(Nlist x) == (Nlist y) = (average x) == (average y) 

私はHaskellのでよくないですし、それを学ぼうとし、いくつかのいずれかが、このエラーで私を助けることができますか?

+2

を?どのようにバナナのリストを平均化していますか? – MathematicalOrchid

+0

私はある種のインスタンス制約を作成する必要があることを理解していますが、実際の作成方法はわかりません。どのように番号リストだけことができることを伝える? –

答えて

5

あなたは、式のインスタンスの同じ型制約必要があります:あなたは `NumList Banana`を持っている場合はどう

instance (Real a) => Eq (NumList a) where 
    (Nlist x) == (Nlist y) = (average x) == (average y)` 
+0

くそー私は愚かです...私は 'Eq(NumList a)=>(Real a)'ありがとう –

関連する問題