2016-04-08 12 views
0

Ich habe eine Situation, wo mehrere keys auf die gleiche value zeigen kann. Da die key Domäne ziemlich klein ist, verwende ich die assoziativen Listen [(key, value)].Haskell "Kopieren Konstruktor" Aufruf

Ersetzt das Einfügen mehrerer Elemente mit unterschiedlichen keys aber gleich values GHC in irgendeiner Weise, um Kopien der values in Frage zu erstellen?

Unter Berücksichtigung der Unveränderlichkeit der Haskell-Variablen denke ich nicht, aber ich will nur sicher sein.

+0

Können Sie klarstellen, was Sie mit Punkt meinen? Hast du etwas wie 'a = 4; b = [(1, a), (2, a)]? –

+0

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 –

+0

Dies könnte helfen: http://stackoverflow.com/questions/20857165/move-or-copy-in-haskell-vs-c –

Antwort

2

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)

1

Sie haben Recht,

aber die überzeugende Punkt kann nicht imutability aber Faulheit sein. In der Tat, wenn Sie den Wert "kopieren" müssten, müsste er "bewertet" werden [1]. Aber das würde Haskell Faulheit brechen.

Auch Argumentation über "Größe" kann in Haskell TREAKY sein: ist foldr (+) [1..1000] die Größe eines Int? Oder die Größe der Funktion Schließung?


1) stricly sprechen, könnten Sie die Thunk vorstellen zu kopieren, aber es wäre nicht wirklich Sinn machen.