Для литерала функции по умолчанию:
(fn: (Option[V1], Option[V2]) => V3 =
(x: Option[V1], y: Option[V2]) => Tuple2(x,y))
Вам нужно использовать слияние следующим образом: merge(m1,m2)()
Я бы сказал, не беспокойтесь о производительности, пока вы не выполните некоторые измерения на реальных данных.
Редактировать: о производительности, предоставляя представление вместо построения карты, вы можете быстро получить «конструкцию» за счет поиска - при условии, что мы имеем дело с неизменяемыми картами. Таким образом, в зависимости от фактических данных и варианта использования, вы можете получить лучшую производительность для определенных операций, но у этого есть компромисс.
class MergedView[K, V1, V2, V3](
left: Map[K, V1], right: Map[K, V2]
)(fn: (Option[V1], Option[V2]) => V3 = (x: Option[V1], y: Option[V2]) => Tuple2(x,y)
) extends collection.DefaultMap[K, V3] {
def get(key: K): Option[V3] = (left.get(key), right.get(key)) match {
case (None, None) => None
case t => Some(fn(t._1, t._2))
}
lazy val tuples = (left.keys ++ right.keys).map(key => key -> get(key).get)
def iterator: Iterator[(K, V3)] = tuples.iterator
}
val r1 = new MergedView(m1, m2)() // use parens here for second param list.