大学での私の仕事は次のとおりです。
次の関数を定義します。
primepowers :: Integer -> [Integer]
これは、与えられたパラメータnの素数の最初のn乗の無限リストを計算し、ascでソートします。つまり、primepowers nには、の要素が昇順で含まれています。
{p ^ i | pは素数、1≤i≤n}です。
このタスクに取り組んだ後、私は行き止まりになりました。私には次の4つの機能があります。
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)
いくつかのサンプル入力でテストしたので、それらは独立して機能すると思います。マージは2つの順序付きリストを1つの順序付きリストにマージします素数は素数の無限リストを返します累乗はnumのn乗を計算します(つまり、num ^ 1、num ^ 2 ... num ^ n)
私はすべてをprimepowersでマージしようとしますが、関数は評価されません。それぞれ、ある種の無限ループが発生します。
素数や累乗の最適化には興味がありません。なぜそれがうまくいかないのか分かりません。それとも、私のアプローチは良くなく、機能的でもなく、haskellでもありませんか?