Consider this method signature: def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That All this complexity to allow for automatic conversions (the following will return a Set[String]) ... BitSet(1, 2, 3).map { _.toString + "!" } In a dynamic language, the signature of map is simply this: (a → b) → [a] → [b] The big difference is that the language doesn't care about types "a" and "b" until runtime…
Not only dynamically typed languages, the signature would also look remarkably close to (a → b) → [a] → [b] in ML and Haskell. Your ML and Haskell compiler would also make check that it was called correctly at compile time without extra unit tests.
If Scala only did what ML and Haskell do, the type signatures would be exactly that.