在大学里,我的任务如下:
定义以下函数:
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)
我认为它们是独立工作的,因为我已经用一些样本输入进行了测试。merge 将两个有序列表合并为一个有序列表 primes 返回无限的素数列表 powers 计算 num 的 n 次方(即 num^1 , num^2 ... num^n)
我尝试将所有内容合并到 primepowers 中,但是没有评估函数,没有任何事情发生,分别有某种无限循环。
我对素数或幂的优化不感兴趣。只是我不明白为什么这不起作用。还是我的方法不好,不实用,不是haskell?