Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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)
  [...]
like image 313
gladed Avatar asked Aug 08 '11 17:08

gladed


3 Answers

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.

like image 163
paradigmatic Avatar answered Nov 18 '22 05:11

paradigmatic


This should do what you want:

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

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

like image 20
soc Avatar answered Nov 18 '22 05:11

soc


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)
like image 9
Xavier Guihot Avatar answered Nov 18 '22 03:11

Xavier Guihot