2013-10-13 9 views
5

Ist es für reine Funktionen in Haskell möglich, lokale Kopien von Variablen zu mutieren, so wie clojure es in Functional Programming Is A Scam! by David Nolen? Wenn nicht, was sind die Gründe dafür, und wenn ja, gibt es irgendwelche Beispiele, auf die mich jemand hinweisen könnte? Eine ähnliche Frage wurde in Functions that look pure to callers but internally use mutation gestellt und der allgemeine Konsens schien zu sein, dass es für reine Funktionen in Ordnung sei, eine Mutation durchzuführen, solange die Mutationen an lokalen Kopien von Variablen durchgeführt wurden (dh die Wirkung der Mutation tut dies nicht) entkomme der Funktion und habe eine nicht-lokale Wirkung).Ist es bei reinen Funktionen in Haskell möglich, lokale Kopien von Variablen zu mutieren?

Die Frage stellt sich, wenn ich die Blase Art in Shen übersetzt (Local mutation, global mutation, mutable datastructures, Bubblesort in Qi), die nicht mutieren der Liste, auf Common Lisp und im Vergleich zum Bubblesort in Bubblesort in Common Lisp, die die Liste nicht mutieren. Das Ergebnis war, dass ich (in Common Lisp) feststellte, dass die Version, die die Liste mutierte, für sehr große Listen wesentlich schneller war als die Version, die die Liste nicht mutierte.

Antwort

11

Die ST Monade ist genau für die sichere Einbettung von veränderbaren Operationen in reinen Code. Das Typsystem wird verwendet, um sicherzustellen, dass keine der mutierten Daten den Geltungsbereich verlassen können. Dadurch erhalten Sie die Leistung eines lokal veränderbaren Zustands ohne die Gefahr, dass Ihr gesamtes Programm statusfähig wird (was die referenzielle Transparenz zerstören oder Race-Bedingungen einführen könnte).

Dokumentation über die ST-Monade:

+0

Danke. Das sumST-Beispiel im "Haskell Wiki" macht deutlich, wie eine reine Funktion lokale Mutationen einsetzen kann. – artella