Hilfe beim Entwerfen einer Baumstruktur - Spannung zwischen funktional und OOP

Ich habe in den vergangenen Tagen f # gelernt und ein kleines Projekt geschrieben, das endlich funktioniert (natürlich mit Hilfe von SO).

Ich versuche zu lernen, so idiomatisch wie möglich zu sein, was im Grunde bedeutet, dass ich versuche, meine Datenstrukturen nicht zu mutieren. Das kostet mich viel Mühe :-) Bei meiner Suche nach einer idiomatischen funktionalen Programmierung habe ich versucht, möglichst viele Listen, Tupel und Aufzeichnungen anstelle von Objekten zu verwenden. Aber dann "übertrifft die Zweckmäßigkeit die Reinheit", und so schreibe ich dieses Mal mein kleines Projekt mit Objekten um.

Ich dachte, Sie könnten mir einen Rat geben, aber meine Vorstellung von einem "guten funktionalen Programmierdesign" ist noch nicht sehr gut definiert.

Zum Beispiel muss ich die Knoten eines Baums modifizieren und gleichzeitig die Zustände auf zwei verschiedenen Ebenen (L und L + 1) modifizieren. Ich war in der Lage, das zu tun, ohne Daten zu mutieren, aber ich brauchte eine Menge "innerer" und "Hilfsfunktionen", mit Akkus und so weiter. Das schöne Gefühl, den Algorithmus klar ausdrücken zu können, ging für mich verloren, weil ich meine Datenstruktur auf involvierte Weise ändern musste. Dies ist zum Beispiel in imperativen Sprachen sehr einfach: Sie müssen nur die Zeiger auf die relevanten Knoten dereferenzieren, ihren Status ändern und den Vorgang wiederholen. Sicher habe ich meine Struktur nicht richtig entworfen, und aus diesem Grund versuche ich jetzt den OOP-Ansatz.

Ich habe mir SICP und das Entwerfen von Programmen angeschaut und eine Arbeit von C. Okasaki ("Rein funktionale Datenstrukturen") gefunden, aber die Beispiele zu SICP und HTDP ähneln denen, die ich gemacht habe, oder ich bin möglicherweise nicht in der Lage um sie vollständig zu verstehen. Die These dagegen ist mir im Moment etwas zu schwer :-)

Was denkst du über diese "Spannung", die ich erlebe? Interpretiere ich die "Never Mutate Data" zu streng? Könnten Sie mir eine Ressource vorschlagen?

Danke im Voraus, Francesco

Antworten auf die Frage(6)

Ihre Antwort auf die Frage