2016-11-20 46 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

如果你有'NumList Banana'?你如何取得一串香蕉? – MathematicalOrchid

+0

我明白我應該制定某種實例約束,但不知道如何製作它。如何告訴它,它只能是數字列表? –

回答

5

你需要同樣類型的約束你的公式例如:

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

該死的我很愚蠢......我正在嘗試'Eq(NumList a)=>(真實的a)'非常感謝 –