Sagen wir, ich möchte eine sortierte unendliche Liste aller Primepower bis zum Exponenten n
bekommen.Unendliche Liste in Haskell kombiniert mit Falte * berechnet nicht
Ich habe eine Funktion, zwei sortierte Listen und eine Funktion, die mir Primzahlen gibt, zusammenzuführen.
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)
Ich habe zwei Versionen der listOfPrimepowers
Funktion:
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
One liefert das richtige Ergebnis und die andere nicht. Der einzige Unterschied besteht darin, dass die erste Version die Primepower auf eine Art wie [[2,3,5,7, ...],[4,9,25,...]]
abbildet und die zweite Version die Primepower wie [[2,4,8],[3,9,27],[5,25,125], ...]
abbildet. Sie sehen, die Unendlichkeit ist auf einer anderen Ebene in der Liste.
Haben Sie eine Erklärung, warum die 2. Funktion keine Ausgabe erzeugt?
mögliches Duplikat von [foldl- gegen foldr-Verhalten mit unendlichen Listen] (http: // stackoverflow.com/questions/3082324/foldl-versus-foldr-behaviour-with-infinite-lists) – ScarletAmaranth
@ScarletAmaranth Sorry, ich wollte foldr im zweiten Code-Extrakt verwenden ... Aber es ist immer noch das gleiche Problem. –