Dieser C-Code kann konzeptionell so beschrieben werden, als würde er ein neues Array erzeugen, das mit einem Eingabe-Array identisch ist, aber mit 1 als erstem Element:
%Vor%Dies ist eine reine Funktion (wink wink Nudge Nudge), solange keine weiteren Referenzen auf das Eingabe-Array und seine Elemente gemacht werden. Das C-System wird das für uns nicht erzwingen, aber es erscheint im Prinzip durchsetzbar.
Der Code, den gcc erzeugt, ist einfach und effizient:
%Vor%Unsere Funktion erreicht das scheinbar Unmögliche, indem wir ein ganzes neues Array in konstanter Zeit erstellen und keinen zusätzlichen Speicher verwenden. Nett. Kann eine Haskell-Funktion mit Array-ähnlichen Ein- und Ausgaben geschrieben werden, die mit ähnlichem Code gültig implementiert werden könnten? Gibt es eine Möglichkeit, "das ist die letzte Referenz auf diese Variable" auszudrücken, so dass eine reine Funktion die Variable hinter den Kulissen kannibalisieren kann?
Wenn die Funktion inline wird, dann muss hier nichts Interessantes passieren. Nehmen wir an, der Aufrufer und die Funktion werden separat kompiliert.
Obwohl ST monad
genau das ist, was Sie beschreiben, können Sie dies in der Praxis implementieren Die meisten davon verwenden STUArray
. Also, ein Mock-up Ihres Codes könnte etwas wie sein:
und wenn Sie eine andere Funktion haben, die das Array an Ort und Stelle mutiert, wie:
%Vor% Sie können die zwei unreinen Funktionen zusammen binden und sie in einer reinen Funktion mit runSTUArray
:
Beachten Sie, dass run
rein bleibt und die früheren Versionen des zurückgegebenen Arrays nicht irgendwo durchgesickert sind :