repräsentieren zustandsbehaftete Dinge in funktionalen Sprachen

8

Ich habe mit funktionalen Sprachen (insbesondere F #) herumgespielt und mag das ganze unveränderliche Konzept wirklich. Allerdings bin ich ein wenig verloren, wie man stateful Dinge in funktionalen Sprachen darstellen soll.

Zum Beispiel, wie würde man das Folgende in eine funktionale Sprache umschreiben? (Jede funktionale Sprache ist in Ordnung ... muss nur meinen Kopf darum wickeln)

%Vor%     
jameszhao00 19.06.2011, 00:58
quelle

3 Antworten

8

Ihr Beispiel enthält einige Dinge, die in einer funktionalen Sprache anders funktionieren würden:

  • Die Klasse ist veränderbar - in funktionalen Sprachen würden Sie einen unveränderlichen Typ verwenden
  • Sie verwenden current_time , um die aktuelle Zeit zu erhalten, aber dies ist keine reine Funktion (sie hängt von einem global wechselnden Status ab). In reinen funktionalen Sprachen (Haskell) ist dies nicht erlaubt (und Sie müssen Monaden verwenden), aber die meisten unreinen funktionalen Sprachen (F #, OCaml) erlauben dies.
  • Ihre main Funktion verwendet eine Schleife - Schleifen werden im Allgemeinen in funktionalen Sprachen abgeraten (obwohl einige sie unterstützen).

Die idiomatische F # -Lösung würde sich mit dem ersten und letzten Punkt so beschäftigen:

%Vor%

Der Typ State ist unveränderbar in dem Sinne, dass er niemals den Wert seines lokalen Feldes ändert. Es ist nicht rein funktional, weil es von der (sich ändernden) aktuellen Zeit abhängt, aber das ist kein Problem in F # (Sie müssen sich dessen nur bewusst sein). Wenn Sie eine Methode benötigen, die den Status ändert (was Sie nicht tun), dann würde die Methode eine neue Instanz von State zurückgeben (genau wie .NET string ).

Die Funktion main wird mit Hilfe einer Rekursion anstelle einer Schleife geschrieben - in diesem Fall spielt es keine Rolle (die Schleife wäre auch in F # in Ordnung). Der Punkt der Verwendung einer Rekursion besteht darin, dass Sie den aktuellen Status als Argument übergeben und eine neue Instanz verwenden können, wenn Sie einen rekursiven Aufruf durchführen (wodurch der aktuelle Status während der Berechnung wesentlich geändert wird).

    
Tomas Petricek 19.06.2011, 09:38
quelle
8
  

Ich bin ein wenig darüber verloren, wie man statusbehaftete Dinge in funktionalen Sprachen darstellen soll.

Letztendlich sind die Computer, die wir normalerweise verwenden, Stateful Dinger. Programmiersprachen müssen auf einer bestimmten Ebene mit dieser Tatsache umgehen oder auf einige der Fähigkeiten ihres Host-Computers verzichten.

FP-Sprachen behandeln diese Tatsache entweder:

  • Ihnen erlaubt, Funktionen zu schreiben, die den Zustand annehmen und einen neuen Zustand erzeugen (wodurch die Funktion statuslos wird)
  • Das stateful Konzept in einer Monade (oder in F #, a Berechnungsausdruck )

Was Ihren Code betrifft, sollten Sie sich die erste dieser Optionen ansehen. Schreiben Sie Ihre Funktionen neu, um die aktuelle Zeit als Argument zu akzeptieren.

    
Merlyn Morgan-Graham 19.06.2011 01:17
quelle
2

Ich weiß nicht viel über F #, aber von dem, was ich verstehe, ist es sehr nah an OCaml. Also hier ist ein OCaml:

Record-Typen sind sehr gut darin. Hier ist ein ähnlicher Code in OCaml:

%Vor%

(Unix-Zeit ist aus irgendeinem Grund ein Gleitkomma in OCaml; Sie könnten in ein int32 konvertieren, wenn Sie sich dadurch besser fühlen.)

    
koschei 19.06.2011 01:52
quelle

Tags und Links