Haskell中的类型问题

Haskell中的类型问题,haskell,types,Haskell,Types,我已经挣扎了半个多小时了。我知道这很简单,但我在Haskell的打字方面很糟糕,即使在阅读了与我非常相似的问题的公认答案后,我仍然无法解决我的问题——更不用说理解它了 守则: p108 = [filter (\[a,b] -> a>0 && b>0) (diophantinepairs n) | n <- [1..]] diophantinepairs :: Integer -> [[Integer]] diophantinepairs n = n

我已经挣扎了半个多小时了。我知道这很简单,但我在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]
谢谢,
Sam.

以下是您如何阅读此类错误的:

No instance for (Fractional Integer)
翻译:您的程序有一个
整数
,但您正在使用
分数
类的方法之一

arising from a use of `/'
翻译:所涉及的方法是
/
,它是
分数类的一部分<代码>整数
不是分数,因此不能将
/
应用于整数

解决方案:改用
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)

以下是您如何阅读此类错误:

No instance for (Fractional Integer)
翻译:您的程序有一个
整数
,但您正在使用
分数
类的方法之一

arising from a use of `/'
翻译:所涉及的方法是
/
,它是
分数类的一部分<代码>整数
不是分数,因此不能将
/
应用于整数

解决方案:改用
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 a => a -> a -> a
但正如我所说,
整数
不是
分数
,这就是为什么

No instance for (Fractional Integer)

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

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

(/) :: Fractional a => a -> a -> a
但正如我所说,
整数
不是
分数
,这就是为什么

No instance for (Fractional Integer)

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

回答得不错,涵盖了备选方案。。在这种特殊情况下,假设除数如广告所示工作,d除以n,因此Sam可以使用div得到这个整数答案。请注意,
div
计算欧几里德除法的商,
quot
在数学上不太有趣,因为它只是在0附近镜像,但另一方面,
quot
在大多数硬件(作为CPU指令)上稍快一些,而且考虑到您使用的是自然整数……@Jedai:对于
Integer
,它们的速度是相同的,因为
Integer
分别存储符号和大小。至少对于大于一个单词的
Integer
来说是这样。很好的答案涵盖了其他选项。。在这种特殊情况下,假设除数如广告所示工作,d除以n,因此Sam可以使用div得到这个整数答案。请注意,
div
计算欧几里德除法的商,
quot
在数学上不太有趣,因为它只是在0附近镜像,但另一方面,
quot
在大多数硬件(作为CPU指令)上稍快一些,而且考虑到您使用的是自然整数……@Jedai:对于
Integer
,它们的速度是相同的,因为
Integer
分别存储符号和大小。至少对于大于一个单词的
整数