I've built an abstraction such as this:
class Thing(val messages: Map[String, Seq[String]]) { 
  def and(that: Thing): Thing = {
    new Thing(this.messages ++ that.messages)
  }
}
this's map of String -> Seq[String] needs to be merged with that's map.
This is the best way I can think of to do this:
def and(that: Thing): Thing = {
  val keys = this.messages.keys ++ that.messages.keys
  val tuples = keys map {
    case key: String =>
      val theseMessages = this.messages.getOrElse(key, Seq[String]())
      val thoseMessages = that.messages.getOrElse(key, Seq[String]())
      (key, theseMessages ++ thoseMessages)
  }
  new Thing(tuples.toMap)
}