Titel sagt alles, wirklich; Das Iterieren über die Sammlung, während der Status zwischen den Schleifen beibehalten wird, und das Beenden der Iteration basierend auf der Beendigungsbedingung sowie das einfache Auslaufen von Elementen kann das gebräuchlichste Muster sein, um irgendetwas in der imperativen Programmierung zu erreichen. Es scheint mir jedoch, wie es etwas funktionelle gentleprogrammers ist vereinbart über oder zumindest zu sprechen Ich traf nie ein Idiom für sie oder ein halb-genormte Namen wie mit map
, fold
, reduce
usw.Gibt es in der funktionalen Programmierung ein Konzept für 'falten mit Pause' oder 'mit Akku finden'?
ich oft verwenden die followinig Code in scala:
implicit class FoldWhile[T](private val items :Iterable[T]) extends AnyVal {
def foldWhile[A](start :A)(until :A=>Boolean)(op :(A, T)=>A) :A = {
if (until(start)) start
else {
var accumulator = start
items.find{ e => accumulator = op(accumulator, e); until(accumulator) }
accumulator
}
}
}
Aber es ist hässlich. Jedes Mal, wenn ich einen deklarativen Ansatz versuche, komme ich mit noch mehr und fast sicher langsamem Code, ähnlich:
Iterator.iterate((start, items.iterator)){
case (acc, i) if until(acc) => (acc, i)
case (acc, i) if i.hasNext => (op(acc, i.next()), i)
case x => x
}.dropWhile {
case (acc, i) => !until(acc) && i.hasNext
}.next()._1
(Eine funktionelle Variante List
s oder Stream
s verwenden würde, aber Iteratoren haben wohl weniger Overhead als die Umwandlung items
zu einem Stream
, als Standard-Implementierung für letztere verwendet sowieso einen Iterator darunter).
Meine Fragen sind:
1) Ist dieses Konzept einen Namen in der funktionalen Programmierung hat, und wenn ja, was ist das Muster mit der Umsetzung verbunden?
2) Was wäre der beste (d. H. Prägnante, generische, faule und am wenigsten Overhead) Weg, es in scala zu implementieren?
Ich habe nie verstanden, warum dies keine Standardimplementierung hat. Ja. Tail Rekursion ist der Weg, es zu tun, aber es ist ein bisschen hässlich (und erfordert eine Hilfsfunktion, für die man einen Namen finden muss, der für mich immer ein bisschen wie ein Code-Geruch aussieht). .'mapUntil' und 'foldLeftUntil' usw. scheinen mir nützliche Dinge zu sein ... –