findMult lst n = [x | x <- lst, x `mod` n == 0]
primes num =
let n = [2..num]
x = ceiling (sqrt num)
nsqrt = [2..x]
not_prime = map (findMult n) nsqrt
in diff2 n (concat not_prime)
当我尝试运行它时,有以下问题
<interactive>:1:0:
Ambiguous type variable `t' in the constraints:
`RealFrac t' arising from a use of `primes' at <interactive>:1:0-8
`Floating t' arising from a use of `primes' at <interactive>:1:0-8
`Integral t' arising from a use of `primes' at <interactive>:1:0-8
Probable fix: add a type signature that fixes these type variable(s)
我尝试使用fromIntegral,但我不认为我使用正确,因为这给了我编译错误。请帮忙。
这样做的目的是找到所有素数直到num。
答案 0 :(得分:4)
当您使用预期浮动值的整数值时,您会收到类似这样的错误消息(反之亦然)。
在这种情况下,问题是您在sqrt
上调用num
,它将浮点值作为参数,使编译器认为num
是浮点值。但是也使用num
作为n
的上限,这是一个整数值列表(因为它用作findMult
的参数,需要一个整数值列表。)
所以在sqrt
上致电num
之前致电fromIntegral
,就像这样:
x = ceiling (sqrt (fromIntegral num))
答案 1 :(得分:3)
不是取平方根,而是可以将所有方格都放到极限。
-- instead of
{- x = ceiling (sqrt num)
nsqrt = [2..x] -}
-- avoid sqrt
nsqrt = takeWhile (\x -> (x-1)^2 < num) [2..]
-- or even avoid multiplication altogether
nsqrt = map fst . takeWhile ((< num) . snd) . zip [2..] $ scanl1 (+) [1,3..]