Eine der großen Eigenschaften eines rein funktionalen Programm, das wandelbar Variablen und andere Nebenwirkungen vermeidet, dass der Wert, dass ein Ausdruck nur auf dem Ausdruck selbst abhängt auswertet. Es kommt nicht darauf an, in welcher Reihenfolge die Dinge ausgewertet werden (von links nach rechts, von links nach rechts, strikt, faul), der Zustand des Betriebssystems, Uhrzeit etc.
Insbesondere bedeutet das, dass rein Funktionseinstellung Jeder Aufruf an new C
gibt ein vollständig identisches Zählerobjekt zurück. Dies ist in der Regel eine gute Sache, weil es es einfacher macht, über Ihr Programm nachzudenken, aber es behindert irgendwie, was Sie dort zu tun versuchen. Um die C-Objekte anders zu machen, müssten Sie ihre Zählerwerte explizit übergeben, was, um ehrlich zu sein, das Problem einfach unter den Teppich wirft.
val c1 = new C(0)
val c2 = new C(1)
Wenn Sie einen globalen „counter“ Variable wie die interne Klassenvariable haben Sie eine Möglichkeit unter Verwendung wurden sie in einem rein funktionalen Rahmen zu realisieren wäre, den Zählerwert für jede Funktion zu übergeben, die ein benötigt Zähler und haben diese Funktionen auch die aktualisierte Version des Zählers. Für ein kurzes Beispiel:
def increment_counter(n: Int): Int = { n + 1)
def create_c(n: Int): (C, Int) = {
val c = new C(n)
val n' = increment_counter n
(c, n')
}
val n = 0
val (c1, n') = create_c(n)
val (c2, n'') = create_c(n')
val n' = increment_counter(n)
können Sie strukturieren das ein bisschen besser mit einem Staat Monad Muster (die meisten Einführungen in Monaden wahrscheinlich dies als Beispiel haben).
Es ist jedoch sehr wahrscheinlich, dass es komplizierter wird, als nur eine veränderbare Variable für den Zähler zu verwenden. Tatsächlich benutze ich normalerweise veränderbare Variablen für diese "global increasing counters" in den funktionalen Sprachen, die mir erlauben, dies zu tun.
Funktoren oder State Monad scheint eine gute Passform – naomik