未解决的实例声明

时间:2015-11-15 12:36:25

标签: haskell

我有两个功能,一个是获取一个数字的squareRoot,它与前一个项目的< 0.0001不同,约好

squareRoot n = squareRoot' (approx n)

squareRoot' ( n : n2 : ns ) | abs (n2 - n) < 0.0001 = n2
                            | otherwise = squareRoot' ( n2 : ns )

另一个使用它来列出无限的素数列表

primes = [ n | n <- [ 2 .. ], isPrime n ]

isPrime 2 = True
isPrime 3 = True

isPrime n = isPrime' n (squareRoot n) primes

isPrime' n squareRoot (h : t)   
   | h < squareRoot && mod n ( h :: Int ) /= 0 = False
   | otherwise = isPrime' n squareRoot t

我简单地看不到我必须在

中产生结果的实例声明
No instance for (Fractional Int) arising from a use of `squareRoot'
Possible fix: add an instance declaration for (Fractional Int)
In the second argument of isPrime', namely `(squareRoot n)'
In the expression: isPrime' n (squareRoot n) primes
In an equation for `isPrime':
    isPrime n = isPrime' n (squareRoot n) primes

有人可以帮帮我吗?感谢

1 个答案:

答案 0 :(得分:2)

除了评论中已经提到的内容之外,我认为您希望在检查squareRoot谓词对象的除数时,仅使用sqrt p获得isPrime吗?

如果是这样,那么您可以使用

而不是使用转换和sqrt
m <= sqrt n <=> m^2 <= n
像这样:

isPrime :: Integer -> Bool
isPrime 1 = False
isPrime p = null [ d | d <- takeWhile (\ m -> m^2 <= p) [2..], p `mod` d == 0 ]

并获得:

λ> take 20 primes
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71]

也是;)

如果您正在寻找获取floor (sqrt p)的方法(我假设approx是某种算法来获取一系列数字来计算根),而不是使用相同的观察结果只会是

sqrtn :: Integer -> Integer
sqrtn n = head [ m | m <- [n,n-1..1], m^2 <= n ]