Haskell: Verwenden Sie den letzten Verweis auf eine Variable, um effizient eine neue Variable zu erstellen

8

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.

    
Praxeolitic 20.11.2015, 07:16
quelle

1 Antwort

6

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:

%Vor%

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 :

aufrufen %Vor%

Beachten Sie, dass run rein bleibt und die früheren Versionen des zurückgegebenen Arrays nicht irgendwo durchgesickert sind :

%Vor%     
behzad.nouri 20.11.2015, 13:28
quelle

Tags und Links