Lazy vs eifrige Bewertung und doppelt verlinkter Listenaufbau

8

Ich kann nicht schlafen! :)

Ich habe in Haskell eine kleine Programmentwicklungsliste geschrieben. Die Eigenschaft der Basissprache, um es zu machen, war faule Bewertung (siehe die Reihe von Code unten). Und meine Frage ist, kann ich das gleiche in einer reinen funktionalen Sprache mit eifriger Bewertung tun oder nicht? Auf jeden Fall, welche Eigenschaften eifrige funktionale Sprache muss in der Lage sein, eine solche Struktur (Verunreinigung?) Zu bauen?

%Vor%     
demi 14.02.2012, 12:51
quelle

3 Antworten

6

Eine doppelt verknüpfte Liste kann rein funktional in einer eifrigen Sprache als Zipper auf einer einfach verknüpften Liste implementiert werden. Siehe beispielsweise Rosetta Code & gt; Doppelt verknüpfte Liste & gt; OCaml & gt; Funktional .

    
Dan Burton 14.02.2012 19:33
quelle
4

Solange eine Sprache so etwas wie Verschlüsse, Lambdas usw. hat, kann man immer Faulheit simulieren. Sie könnten diesen Code sogar in Java umschreiben (ohne Variablen zu verändern usw.), Sie müssen nur jede "faule" Operation in etwas wie

umbrechen %Vor%

Natürlich würde das schrecklich aussehen, aber es ist möglich.

    
Landei 14.02.2012 13:18
quelle
4

In der nicht-rückverfolgenden Teilmenge von Prolog, die als explizit einmal-set eifrige reine funktionale Sprache angesehen werden kann, können Sie die doppelt verknüpften Listen einfach erstellen. Es ist die referentielle Transparenz, die es in Haskell schwierig macht, denn es verbietet die explizite Einstellung der genannten , explizit noch nicht gesetzten logischen Variablen durch Prolog und zwingt stattdessen Haskell dazu erreichen den gleichen Effekt in der verzogenen Art des "Knotens". Ich denke.

Plus, es gibt wirklich keinen großen Unterschied zwischen Haskells bewachter Rekursion unter Lazy Evaluation und Prologs offenen Listen, die in tail-recursion modulo contras Mode eingebaut sind. IMO. Hier ist zum Beispiel ein Beispiel für faule Listen in Prolog . Der gemountete freigegebene Speicher wird als universeller Zugriffsmediator verwendet, sodass die Ergebnisse vorheriger Berechnungen so arrangiert werden können, dass sie zwischengespeichert werden.

Wenn Sie darüber nachdenken, können Sie C restriktiv als eine eifrige reine funktionale Sprache verwenden, wenn Sie niemals eine Variable oder einen Zeiger zurücksetzen, nachdem er einmal gesetzt wurde. Sie haben immer noch Nullzeiger, genau wie Prolog Variablen hat, also ist es auch explizit einmal gesetzt . Und natürlich können Sie doppelt verknüpfte Listen damit erstellen.

Die einzige Frage, die übrig bleibt, ist: Geben Sie einmal eingestellte Sprachen als pure an?

    
Will Ness 14.02.2012 17:52
quelle