假設我想要得到指數爲n
的所有primepowers的已分類無限列表。haskell中的無限列表與fold *結合*不會計算
我有一個函數來合併兩個排序列表和一個函數,讓我素數。
merge :: Ord t => [t] -> [t] -> [t]
merge (x:xs) (y:ys)
| (x <= y) = x : merge xs (y:ys)
| otherwise = y : merge (x:xs) ys
merge xs [] = xs
merge [] ys = ys
primes :: [Integer]
primes = sieve [2..]
where
sieve [] = []
sieve (p:xs) = p : sieve (filter (\x -> x `mod` p /= 0) xs)
我有listOfPrimepowers
函數的兩個版本:
primepowers :: Integer -> [Integer]
primepowers n = foldr (merge) [] (listOfPrimepowers n)
-- terminating
listOfPrimepowers' n = map(\x -> (map(\y -> y^x) primes)) [1..n]
-- non terminating
listOfPrimepowers'' n = map(\x -> (map(\y -> x^y) [1..n])) primes
提供一個正確的結果,另一個沒有。唯一的區別在於,第一個版本以[[2,3,5,7, ...],[4,9,25,...]]
的方式映射了primepowers,第二個版本映射了像[[2,4,8],[3,9,27],[5,25,125], ...]
這樣的primepowers。你看,無窮大在列表中的另一層。
你有解釋爲什麼第二個函數不會產生任何輸出嗎?
[foldl與無限列表的foldr行爲](http:// stackoverflow。com/questions/3082324/foldl-versus-foldr-behavior-with-infinite-lists) – ScarletAmaranth
@ScarletAmaranth對不起,我的意思是在第二個代碼提取中使用foldr ......但它仍然是同樣的問題。 –