Technisch hängt es von der Haskell-Implementierung ab: Der Haskell-Bericht schreibt keine Kopie vor oder zu vermeiden, es verlangt nur, dass das Ergebnis das richtige ist - Leistungsprobleme beiseite.
aber sagen, dass sollten Sie nicht erwarten GHC dieses
let value1 = "hello" ++ "world"
value2 = "hell" ++ "oworld"
in [(1, value1), (2, value2)]
in diesem
let value = "helloworld"
in [(1, value), (2, value)]
nur zu optimieren, da zwei Werte gleich sind, ist es sie bedeutet nicht den gleichen Speicherbereich teilen .
Im letzten Beispiel wird die Zeichenkette value
nicht kopiert, wenn sie zweimal in die Liste eingefügt wird, da es nicht notwendig ist: Zwei Paare werden mit einem Feld konstruiert, das auf dieselbe Zeichenkette zeigt. Also wird nur ein Zeiger kopiert.
Speichern von Kopien ist auch der Grund, warum manchmal nicht
wir schreiben
foo (x, "hello") = (x, "hello")
foo (x, y) = (x, "foo:" ++ y)
sondern
foo [email protected](x, "hello") = p
foo (x, y) = (x, "foo:" ++ y)
Letztere werden Ausgang die gleiche „Zeiger“ auf die Eingangspaar bevorzugen, anstatt den Bau ein neuer mit identischem Wert. (Ich bin mir nicht sicher, ob GHC diese Optimierung manchmal selbst durchführt)
Können Sie klarstellen, was Sie mit Punkt meinen? Hast du etwas wie 'a = 4; b = [(1, a), (2, a)]? –
Ja, genau so :) Meine Sorgen sind, dass, wenn die Variable 'a' groß ist (denke 10 Megabyte), Kopien davon ist nur schlecht für die Moral –
Dies könnte helfen: http://stackoverflow.com/questions/20857165/move-or-copy-in-haskell-vs-c –