Haskell - 无法推断实例

时间:2018-05-01 11:06:51

标签: haskell

我写了以下谓词(第94-99行)

diffFreqMatrix :: Fractional a => [[Rating a]] -> [a]
diffFreqMatrix (x:xs) =  diffFreqMatrixH (x:xs) (matrixPairs (length x))
diffFreqMatrixH _ [] = []
diffFreqMatrixH x ((a,b):ys) = [(diffFreqMatrixH2 x a b 0 0)] ++ diffFreqMatrixH x ys
diffFreqMatrixH2 [] _ _ x y = x / y
diffFreqMatrixH2 (x:xs) a b summ num = if (((x!!a) /= NoRating) && ((x!!b) /= NoRating)) then  diffFreqMatrixH2 xs a b (summ + ((x!!a) - (x!!b))) (num + 1) else diffFreqMatrixH2 xs a b summ num

据说它计算了我想要的平均值,但我得到了这个错误

ERROR file:.\project.hs:98 - Cannot infer instance
*** Instance   : Fractional (Rating a)
*** Expression : diffFreqMatrixH2

帮助我使用以防你想看看

matrixPairs :: Num a => a -> [(a,a)]
matrixPairs 0 = []
matrixPairs c = matrixPairsH 0 0 (c-1)
matrixPairsH a b c = [(a,b)] ++ if ((b == c) && (a == c)) then [] else if (b == c) then (if (a==c) then [] else matrixPairsH (a+1) 0 c ) else matrixPairsH a (b+1) c


differeneRatings :: Fractional a => Rating a -> Rating a -> a
differeneRatings NoRating (R a) = 0
differeneRatings (R a) NoRating = 0
differeneRatings NoRating NoRating = 0
differeneRatings  (R a) (R b) = a - b

1 个答案:

答案 0 :(得分:2)

您使用Rating a就好像它们只是数字一样:

(x!!a) - (x!!b)

您可能需要在casex!!a上使用x!!b或类似的模式匹配来提取它们包含的数字。您可以将NoRating的支票移至该case匹配,以简化您的代码。例如:

case (x!!a, x!!b) of
    (YesRating ra, YesRating rb) -> diffFreqMatrixH2 xs a b (summ + ra - rb) (num + 1)
    _ -> diffFreqMatrixH2 xs a b summ num

一旦你按照自己想要的方式工作,我建议你发帖AngularJS;您的代码可以显着清理,既简单又快捷。