在大学里我的任务是:哈斯克尔 - 总理权力锻炼; Tibial - 无限合并
定义下列功能:
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)
我认为他们独立工作,因为我有一些样品输入测试。 合并合并两个有序列表,以一个有序列表 素数的回报素数的无限名单 权力计算NUM正的权力(即NUM^1,NUM^2 ... NUM^N)
我尝试合并一切都在primepowers中,但函数没有被评估,没有发生任何分别的一些无限循环。
我对素数或能力的优化不感兴趣。只是我不明白为什么这不起作用。或者,我的方法不好,没有功能,不是哈斯克尔?
问题陈述自相矛盾。 “前n个素数的无限权力列表”和“{p^i | p是素数,1≤i≤n}“是完全不同的。 –
你好。我纠正了它。这是一个翻译错误 – niklas