Also opinions –
Vector are both decent choices, but have wildly different performance characteristics. So it sort of depends on what you need to do. For problems where
List works well, I will usually default to that – as @BalmungSan says, I probably use that 90% of the time.
I sometimes use
Vector for random access, and sometimes for a collection where I need to add values other than at the front, but it’s a bit controversial.
Vector is good at everything, but it isn’t great at anything, and its performance characteristics are a little hard to describe concisely. (Many operations are often referred to as “effectively constant time”, which makes some folks quite unhappy.) So it’s great for beginners, but folks doing serious work, especially if it requires high (and well-defined) performance, tend to look elsewhere.
Seq – when I started in Scala, it was pretty common to use
Seq everywhere, and I still do so sometimes. But it loses a lot of terribly important performance information: it’s vague and mushy. So I think most of the community has moved away from using it routinely at this point, in favor of more concrete types. (Or at least, more precise traits.) I will sometimes use it as a function parameter for easy problems, but there is rarely a principled reason to use it – most problems are either flexible enough that you could use
Iterable instead, or they call for more-precise behavior, so you want one of the sub-traits.
(And the base
scala.collection.Seq is arguably slightly evil, since it allows mutable values to be passed as parameters, which is almost never what you want.)