Ich bin dabei, Scala durch Coursera Kurs (Progfun) zu lernen.Scala verwendet veränderbare Variablen, um seine Apis zu implementieren
Wir werden gelernt, funktional zu denken und Tail-Rekursionen zu verwenden, wenn es möglich ist, Funktionen/Methoden zu implementieren.
def foreach[T](list: List[T], f: [T] => Unit) {
if (!list.isEmpty) foreach(list.tail) else f(list.head)
}
Dann apis Ich war überrascht, als ich die folgende Implementierung in einiger Scala gefunden:
override /*IterableLike*/
def foreach[B](f: A => B) {
var these = this
while (!these.isEmpty) {
f(these.head)
these = these.tail
}
}
Und als Beispiel für foreach auf einer Liste Funktion haben wir es wie zu implementieren gelehrt
Wie also werden wir gelernt, Rekursion zu verwenden und die Verwendung von veränderlichen Variablen zu vermeiden, und die API wird durch gegenteilige Techniken implementiert?
Werfen Sie einen Blick auf scala.collection.LinearSeqOptimized
wo scala.collection.immutable.List
erweitern. (ähnliche Implementierung in der List-Klasse selbst gefunden)
Rekursion neigt dazu, einige Algorithmen einfacher und eleganter zu machen, aber langsamer zu laufen, mehr Stapel zu nehmen, wenn nicht Schwanz optimiert und erfordert einen bestimmten Denkprozess, der für einige schwierig sein kann. Viele natürliche Prozesse sind rekursiv, aber bis wir ähnliche natürliche Computer haben, die nicht helfen. Suchen Sie nach "Unterseite der Rekursion" für mehr Aussichtspunkte. Siehe http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html für Guido van Rossums Standpunkte, insbesondere die dritte. –