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)。

したがって、sqrton numcallを呼び出す前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 に答える