我有两个功能,一个是获取一个数字的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
有人可以帮帮我吗?感谢
答案 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 ]