Ist es zulässig, zu reduzieren auf einen leeren Menge von Mengen?

Sollte dies nicht funktionieren?

> val setOfSets = Set[Set[String]]()    
setOfSets: scala.collection.immutable.Set[Set[String]] = Set()

> setOfSets reduce (_ union _)
java.lang.UnsupportedOperationException: empty.reduceLeft
  at scala.collection.TraversableOnce$class.reduceLeft(TraversableOnce.scala:152)
  [...]
  • reduzieren ist ein Spezialfall der Faltung. Sie wollen wahrscheinlich foldLeft ausgehend von der leeren Menge.
  • Das ist wahr. Aber was ist, wenn ich dabei war (_ intersect _)?
  • Was würden Sie erwarten, dass der Rückgabewert in diesem Fall? In der Regel, was sollte reduce/reduceLeft/reduceRight Gegenzug, wenn ihm eine leere Sammlung? Der Funktion sind Sie die Verringerung mit Typ A => B => B für eine Sammlung C[A], so haben Sie keine Möglichkeit, zu produzieren, die einen Wert vom Typ B aus der Luft gegriffen.
  • Die Absicht ist es, "geben Sie mir nur die strings, die angezeigt werden, in der alle Sätze, die Sie haben". Wenn die Menge der gefundenen sets leer ist, würde man erwarten, dass das Ergebnis leer sein. Weil, wie reduce arbeitet, der Spezialfall einer leeren Menge hat, die behandelt werden, mit einer Bedingung zu liefern, der fehlende Typ B. Ich hatte gehofft, für etwas mehr elegant.
  • Ergebnis [wird] leer" ist nicht ein allgemeiner Begriff für eine beliebige B. Jedoch, Sie sollten check out Scalaz ist Foldable trait; insbesondere, Blick auf foldMap[A,M](t: F[A], f: A => M)(implicit m: Monoid[M]): M. Ein monoid ist einfach ein Typ mit einer assoziativen binären operation (z.B. ++ für Listen union für Mengen * für zahlen, ...) und eine Identität für Sie, dass der Betrieb (List(), Set(), 1). <weiter...>
  • <...weiter> Mit foldMap können Sie angeben, wie Sie Elemente Ihrer Sammlung in die Elemente ein monoid, und dann implizit verbindet diese mit der binären operation und der null-Fall. Dies funktioniert, weil für monoiden, die "leere" ist ein generischer Begriff (und so ist "die Zusammenführung von zwei Objekten"). (In anderen Worten, t.foldMap(f) wird t.fold((a,m) => f(a) |+| m)(mzero[M]), wo |+| ist der binäre operator und mzero ist die Identität.)

InformationsquelleAutor gladed | 2011-08-08
Schreibe einen Kommentar