Haskell中的类型问题
我已经挣扎了半个多小时了。我知道这很简单,但我在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
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
分别存储符号和大小。至少对于大于一个单词的整数
。