1

我已经为此苦苦挣扎了半个多小时。我知道这很简单,但是我在 Haskell 中的类型很糟糕,即使在阅读了与我的问题非常相似的公认答案之后,我仍然无法解决我的问题 - 更不用说理解它了!

编码:

p108 = [filter (\[a,b] -> a>0 && b>0) (diophantinepairs n) | n <- [1..]]

diophantinepairs :: Integer -> [[Integer]]
diophantinepairs n = nub$map sort b
    where
        a = divisors n
        b = [[(n-d), n - (n^2)/d] | d <- a]

错误 :

249:39:
    No instance for (Fractional Integer)
      arising from a use of `/'
    Possible fix: add an instance declaration for (Fractional Integer)
    In the second argument of `(-)', namely `(n ^ 2) / d'
    In the expression: n - (n ^ 2) / d
    In the expression: [(n - d), n - (n ^ 2) / d]

谢谢,山姆。

4

2 回答 2

8

以下是您阅读此类错误的方式:

No instance for (Fractional Integer)

翻译:您的程序有一个,但您正在使用该类Integer的方法之一。Fractional

arising from a use of `/'

翻译:所涉及的方法是/,它是Fractional类的一部分。 Integer不是Fractional,因此您不能应用于/整数。

解决方案:使用divorquot代替。

我可以ghci很容易地得到同样的错误:

Prelude> (1 :: Integer) / (2 :: Integer)

<interactive>:2:16:
    No instance for (Fractional Integer)
      arising from a use of `/'
    Possible fix: add an instance declaration for (Fractional Integer)
    In the expression: (1 :: Integer) / (2 :: Integer)
    In an equation for `it': it = (1 :: Integer) / (2 :: Integer)

替代修复:使用Fractional诸如 a 之类的类型Rational而不是Integer

Prelude> (1 :: Integer) `div` (2 :: Integer)
0
Prelude> :m + Data.Ratio
Prelude Data.Ratio> (1 :: Rational) / (2 :: Rational)
1 % 2
于 2013-01-24T01:32:10.013 回答
4

与某些语言不同,在/处理整数时不会重载。这是有道理的:整数“除法”与理性除法不同。在哈斯克尔

(/) :: Fractional a => a -> a -> a

但正如我所说,这Integer不是Fractional你得到的原因

No instance for (Fractional Integer)

相反,您可以使用执行整数除法的quotor函数。div

于 2013-01-24T01:34:38.323 回答