Хаскель неоднозначного типа - PullRequest
2 голосов
/ 11 февраля 2011
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, но я не думаю, что я использовал правильно, поскольку это дает мне ошибку компиляции.Пожалуйста, помогите.

Цель этого состоит в том, чтобы найти все простые числа вплоть до числа.

Ответы [ 2 ]

4 голосов
/ 11 февраля 2011

Такие сообщения об ошибках появляются, когда вы используете целочисленное значение, в котором ожидалось плавающее значение (или наоборот).

В этом случае проблема в том, что вы вызываете sqrt, который принимает значение с плавающей запятой в качестве аргумента, на num, заставляя компилятор думать, что num является значением с плавающей запятой. Но также используйте num в качестве верхнего предела для n, который представляет собой список целочисленных значений (поскольку он используется в качестве аргумента для findMult, который нуждается в списке целочисленных значений).

Итак, прежде чем звонить sqrt на num, позвоните fromIntegral на нем, например:

x = ceiling (sqrt (fromIntegral num))
3 голосов
/ 11 февраля 2011

Вместо того, чтобы взять квадратный корень, вы можете взять все квадраты до предела.

-- 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..]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...