Haskell暧昧型

时间:2011-02-10 21:44:03

标签: haskell types primes ambiguous

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。

2 个答案:

答案 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..]