Lets sagen, dass ich zwei Funktionen gegeben habe:Verschachtelung Listenfunktionen
f :: [a] -> b
g :: [a] -> c
ich eine Funktion schreiben wollen, die das Äquivalent davon ist:
h x = (f x, g x)
Aber wenn ich das tue, für große Listen zwangsläufig ich nicht mehr genügend Speicher.
Ein einfaches Beispiel ist die folgende:
x = [1..100000000::Int]
main = print $ (sum x, product x)
Ich verstehe dies der Fall ist, weil die Liste x
wird, ohne Müll gesammelt im Speicher abgelegt werden. Es wäre besser, statt f
und g
auf x
in, naja, "parallel" gearbeitet.
Angenommen, ich nicht f
ändern und g
, noch will eine separate Kopie von x
machen (unter der Annahme x
ist teuer in der Herstellung), wie kann ich h
schreiben, ohne Probleme aus dem Speicher läuft in?
Ich habe das nicht wirklich vorher studiert, aber http://squing.blogspot.com/2008/11/beautiful-folding.html ist direkt am Punkt. Conal Elliot hat auch ein paar Follow-ups zu diesem Thema gemacht. – Carl