EDITED!Создать бесконечный список в Haskell с IO
Я пытаюсь написать алгоритм, который генерирует (бесконечный) список простых чисел Мерсена. У меня есть алгоритм (Rabin-Miller), который возвращает IO Bool, в зависимости от того, считает ли алгоритм число простым или нет. Этот алгоритм называется rabinMiller, и он принимает два аргумента: первый - Integer, который говорит что-то о безопасности списка, и второе число, которое мы отправляем на тест primality.
Я хочу индексировать список всех простых чисел (называемых простых чисел), и для каждого p в простых количествах, проверьте, считает ли rabinMiller, что 2^p - 1 является простым. Если это так, мы представляем 2^p - 1 в список.
То, что я сейчас это:
rbMersenneGen :: Integer -> IO(IO [Integer])
rbMersenneGen k = do return $ rbMersenneGens 0 k
rbMersenneGens :: Int -> Integer -> IO [Integer]
rbMersenneGens x k =
let n = primes!!x
m = (2^n) - 1
in do
prim <- rabinMiller k m
if prim then
m:rbMersenneGens (x + 1) k
else
rbMersenneGens (x + 1) k
Но это на самом деле не работает, так как я не могу получить тип m:rbMersenneGens (x + 1) k
правой. Я получаю ошибку, что m
является Integer
вместо [Integer]
, а затем типа всей m:rbMersenneGens (x + 1) k
неправильно и создает другие ошибки
Вы должны: 'if prim, а затем xs <- rbMersenneGens (x + 1) k; return m: xs' для соответствия типам. – Bakuriu
Проблема в том, что Рабин-Миллер использует случайные числа. У Haskell есть проблема со случайными числами, потому что они по сути нечистые. Если это ваша реализация Рабина-Миллера, вам нужно переписать его, чтобы принять случайное семя в качестве аргумента. Или используйте другой тест на соответствие. –