我已经挣扎了半个多小时。我知道这很简单,但我对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]
谢谢, 萨姆。
答案 0 :(得分:8)
以下是您阅读这些错误的方法:
No instance for (Fractional Integer)
翻译:您的程序有一个Integer
,但您正在使用其中一个Fractional
类的方法。
arising from a use of `/'
翻译:所涉及的方法是/
,它是Fractional
类的一部分。 Integer
不是Fractional
,因此您无法将/
应用于整数。
解决方案:改为使用div
或quot
。
我可以很容易地在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
类型,例如Rational
代替Integer
:
Prelude> (1 :: Integer) `div` (2 :: Integer)
0
Prelude> :m + Data.Ratio
Prelude Data.Ratio> (1 :: Rational) / (2 :: Rational)
1 % 2
答案 1 :(得分:4)
与某些语言不同,/
不会超载以处理整数。这是有道理的:整数“分裂”与理性分裂不同。在Haskell
(/) :: Fractional a => a -> a -> a
但正如我所说,Integer
不是Fractional
,这就是
No instance for (Fractional Integer)
相反,您可以使用执行整数除法的quot
或div
函数。