Ich weiß nicht, was die Designer dieser Typen bei der Implementierung der veränderbaren Versionen im Sinn hatten, aber das Problem, das ich sehe, ist mit Faulheit und der Erwartung von Konsistenz zu tun.
Angenommen, ich erstelle einen veränderbaren Vektor von drei Ints, map (* 2)
über sie, und ändern Sie dann den ursprünglichen Vektor. Wenn ich mir die Ausgabe der Karte anschaue, sehe ich doppelte alte Werte oder neue Werte? Die Antwort ist, es hängt davon ab, welche Elemente ich vor dem Modifizieren betrachtet habe und welche danach. Bedenken Sie:
main = do
v <- V.replicate 3 1
let doubled = map (* 2) v
putStrLn "First doubled number is: " ++ show (head doubled)
set v 10
putStrLn "Sum of doubled numbers is: " ++ show (sum doubled)
Obwohl wir unsere Operationen durchgeführt in gut definierten Blöcken, bedeutet das Caching von Thunks, dass das erste Element des doubled
2 sein wird, denn wir hatten es zu zwingen, um es zu drucken vor wir setze den ganzen Vektor auf 10, aber die letzten beiden Elemente von doubled
werden 20 sein, also ist unsere Summe 42: weder die Summe des Doppelten des ursprünglichen Vektors, noch die Summe des Doppelten des letzten Vektors. Es ist uns gelungen, einen inkonsistenten Zustand zu beobachten, in dem unser System als Ganzes nie sein sollte, weil wir einen veränderlichen Vektor so behandelt haben, als wäre es eine unveränderliche Liste, indem wir versuchen, ihn träge darüber hinweg zu bewegen.
Wird es nicht richtig fusioniert, wenn Sie es als eine Zusammensetzung von 'falten' und' freeze' schreiben? – Cactus
@Cactus Ich habe keine Ahnung. Es gibt keine Dokumentation dazu. – rityzmon