Scalaをはじめとする関数型プログラミングでは、List(コレクション)に要素を追加する必要がある場合、そのロジックがおかしいのではないかと疑ってください。
コレクションは基本的にImmutable(不変)であるべきです。
また、Listへの要素の追加を表現する場合は、:+は使わず、::(cons)を使うのが一般的です。
val lst = "aaa" :: "bbb" :: Nil
println(lst) // => List(aaa, bbb)
List同士を連結する必要がある場合は、:::演算子を使います。
val lst0 = "aaa" :: "bbb" :: Nil
val lst1 = "ccc" :: "ddd" :: Nil
println(lst0 ::: lst1) // => List(aaa, bbb, ccc, ddd)
Scalaのパターンマッチでは、この::を用いてListに型をマッチさせることもできますし、再帰的な表現でも非常に便利です。
たとえば、Listを受取って、そのListが空で無ければ先頭の要素を、空の場合はNoneを返す、headOptionという関数をパターンマッチを使って無理やり実装すると、次のようになります。
def headOption(ls: List[Any]): Option[Any] = ls match {
case Nil => None
case head :: tail => Some(head)
}
val lst0 = List("aaa", "bbb", "ccc", "ddd")
println(headOption(lst0)) // => Some(aaa)
val lst1 = List()
println(headOption(lst1)) // => None