试图创建Haskell Eq实例

Luk*_*vas 1 haskell types

我正在尝试为我创建的列表类型创建一个Eq实例.只有当两个列表平均值相等时,Eq才会返回true.

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)`
Run Code Online (Sandbox Code Playgroud)

但是当我尝试编译这个时,我得到错误:

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)
Run Code Online (Sandbox Code Playgroud)

我对haskell并不好,并试图学习它,有人可以帮我解决这个错误吗?

I3c*_*3ck 5

您的Eq实例需要相同的类型约束:

instance (Real a) => Eq (NumList a) where
    (Nlist x) == (Nlist y) = (average x) == (average y)`
Run Code Online (Sandbox Code Playgroud)