Я сократил ваш пример еще больше:
scala> if(!M.contains(1)) {M += 1 -> mutable.Set[Int](1)} else {M(1) += 1};
<console>:9: error: type arguments [Any] do not conform to trait Cloneable's type parameter bounds [+A <: AnyRef]
val res17 =
^
Проблема возникает, когда компилятор пытается найти общий тип возврата для обеих веток:
Первый -
scala> M += 1 -> mutable.Set[Int](1)
res19: scala.collection.mutable.Map[Int,scala.collection.mutable.Set[Int]] = ...
И часть "еще" -
scala> M(1) += 1
res18: scala.collection.mutable.Set[Int] = Set(1)
Если я добавлю возвращаемое значение в конец этого выражения, REPL съест его без ошибок:
scala> if(!M.contains(1)) {M += 1 -> mutable.Set[Int](1)} else {M(1) += 1}; println("hello")
hello
Поскольку тип возвращаемого выражения - Unit.