Funktionale Programmierung - GUI

Hallo,

ich hab mal eine Frage zur Funktionalen Programmierung.

Das Prinzip mit „Objekte dürfen sich nicht verändern“ ist mir bekannt, aber irgendwo muss es doch auch eine Grenze geben oder?

Beispiel:

Class A{
val B
}

Class B{
val C
}

Class C(zahl:Int){
val z = zahl
def setWert(wert:Int)=return new C(wert)
}

Ich möchte jetzt z.B. in Klasse B den val C auf 6 setzen. Dazu muss ich ja ein neues Objekt von C erzeugen, da ich das momentane Objekt nicht verändern darf.

So… wenn ich aber dem Attribut C von der Klasse B bzw. von der Instanz B den Wert 6 zuweisen will, dann ändert sich doch so gesehen auch die Instanz B? So mit müsste ich ja von B auch wieder ein neues Objekt erzeugen. Und wenn B ein Attribut von A ist, dann muss ich doch auch von A wieder ein neues Objekt erzeugen, weil das sich ja auch ändert.

Ich hoffe ihr versteht was ich meine. Nach dem Prinzip wie ich das verstanden habe, müsste es dann ja eine Änderungsspirale in die höher liegenden Klassen geben? Aber irgendwann muss doch mal Schluss sein, ein Objekt muss doch veränderbar sein! Oder wie wird das gemacht?

Ich stell mir GUI-Programmierung im funktionalen Programmierstil kompliziert vor.

Nehmen wir mal eine normale Java-Swing Oberfläche (Ok schlechtes Beispiel für funktionale Möglichkeiten).
Ich möchte die Beschriftung eines Buttons während der Laufzeit ändern.

  1. Ich muss einen neuen Button mit der neuen Aufschrift erzeugen
  2. Ich muss den Button dem Dialog ja wieder hinzufügen
  3. Der Dialog selbst ändert sich durch den neuen Button ja auch, also neuen Dialog erstellen? Aber dann muss ich mir ja seine Position, Größe etc. merken, wenn ich den neuen erstelle.

Versteht ihr was ich meine? Irgendwo muss ich doch da was falsch verstanden haben, ansonsten ist das doch ziemlich hässlich oder nicht?

Also ich persönlich sehe keine sinnvolle Möglichkeit eine GUI durch eine funktionale Sprache zu programmieren.

Was aber möglich wäre und oft durch funktionale Sprachen abgedeckt wird, ist das „Vorbereiten“ einer GUI. Danach wird das Resultat der Vorbereitung durch einen entsprechenden Viewer angezeigt.

Ein Beispiel:
Das Programm generiert XML als Output
mit XSL(T) wird dieser z.B. zu HTML transformiert
Der Viewer dieses HTMLs ist ein Webbrowser