В университете моя задача следующая:
определить следующую функцию:
primepowers :: Integer -> [Integer]
, который вычисляет бесконечный список первых n степеней простых чисел для заданного параметра n, отсортированный asc.
То есть,
Primepowers n содержит в порядке возрастания элементы
{p ^ i | p простое, 1≤i≤n}.
После работы над этим заданием я зашел в тупик. У меня есть следующие четыре функции:
merge :: Ord t => [t] -> [t] -> [t]
merge [] b = b
merge a [] = a
merge (a:ax) (b:bx)
| a <= b = a : merge ax (b:bx)
| otherwise = b : merge (a:ax) bx
primes :: [Integer]
primes = sieve [2..]
where sieve [] = []
sieve (p:xs) = p : sieve (filter (not . multipleOf p) xs)
where multipleOf p x = x `mod` p == 0
powers :: Integer -> Integer -> [Integer]
powers n num = map (\a -> num ^ a) [1..n]
primepowers :: Integer -> [Integer]
primepowers n = foldr merge [] (map (powers n) primes)
Я думаю, что они работают независимо, как я тестировал с некоторыми примерами входных данных.
объединить объединяет два упорядоченных списка в один упорядоченный список
простые числа возвращают бесконечный список простых чисел
powers рассчитывает n степеней num (то есть num ^ 1, num ^ 2 ... num ^ n)
Я пытаюсь объединить все в простые числа, но функции не оцениваются, ничего не происходит, соответственно, существует некий бесконечный цикл.
Я не заинтересован в оптимизации простых чисел или степеней. Просто я не понимаю, почему это не работает. Или мой подход не хороший, не функциональный, не haskell?