Is it valid to reduce on an empty set of sets?

19,559

Solution 1

Reduce (left and right) cannot be applied on an empty collection.

Conceptually:

myCollection.reduce(f)

is similar to:

myCollection.tail.fold( myCollection.head )( f )

Thus the collection must have at least one element.

Solution 2

This should do what you want:

setOfSets.foldLeft(Set[String]())(_ union _)

Although I haven't understood the requirement to not specify an ordering.

Solution 3

Starting Scala 2.9, most collections are now provided with the reduceOption function (as an equivalent to reduce) which supports the case of empty sequences by returning an Option of the result:

Set[Set[String]]().reduceOption(_ union _)
// Option[Set[String]] = None
Set[Set[String]]().reduceOption(_ union _).getOrElse(Set())
// Set[String] = Set()
Set(Set(1, 2, 3), Set(2, 3, 4), Set(5)).reduceOption(_ union _).getOrElse(Set())
// Set[Int] = Set(5, 1, 2, 3, 4)
Share:
19,559
gladed
Author by

gladed

Never stop learning.

Updated on June 07, 2022

Comments

  • gladed
    gladed almost 2 years

    Shouldn't this work?

    > 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)
      [...]