2
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 的所有素数。

4

2 回答 2

4

当您使用预期为浮点值的整数值(反之亦然)时,您会收到类似的错误消息。

在这种情况下,问题在于您正在调用sqrt,它以浮点值作为参数,num使编译器认为num是浮点值。但也num用作 的上限n,它是整数值列表(因为它被用作findMult需要整数值列表的参数)。

所以在调用sqrtnum之前fromIntegral,像这样:

x = ceiling (sqrt (fromIntegral num))
于 2011-02-10T22:20:18.830 回答
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..]
于 2011-02-11T04:56:35.843 回答