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 TypA => B => B
für eine SammlungC[A]
, so haben Sie keine Möglichkeit, zu produzieren, die einen Wert vom TypB
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 TypB
. 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 istFoldable
trait; insbesondere, Blick auffoldMap[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 Listenunion
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)
wirdt.fold((a,m) => f(a) |+| m)(mzero[M])
, wo|+|
ist der binäre operator undmzero
ist die Identität.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Reduzieren (Links und rechts) kann nicht angewendet werden auf eine leere Sammlung.
Konzeptionell:
ähnlich ist:
Also die Abholung muss mindestens ein element.
reduceLeft
oderreduceRight
; ich verwendetreduce
, die nicht geben Sie eine Bestellung.reduce
Gegenzug eineOptional
statt das tatsächliche Ergebnis. Also, wenn die Sammlung leer ist, bekommst du nur zurückNone
statt eine Laufzeit-exception.reduceOption
gibt es auch.Sollte dies tun, was Sie wollen:
Obwohl ich noch nicht verstanden die Anforderung nicht an eine Bestellung.
Ab
Scala 2.9
meisten Sammlungen sind nun mit denreduceOption
Funktion (als äquivalent zureduce
), die unterstützt den Fall von leeren Sequenzen durch Rücksendung einerOption
Ergebnis: