Ну, если это действительно открытый вопрос, то по определению мы не знаем ответа на # 1. Пространства дизайна довольно разные, и для меня не очевидно, как можно напрямую кодировать подтипы в ограниченный полиморфизм. Кодировка является прямой, когда аргументы являются полиморфными. Например, функция Haskell с типом
foo :: (Num a) => a -> Bool
эквивалентно, скажем,
Bool foo(Num x)
на ОО языке. Однако не ясно, как кодировать:
// I will return some Num, but I'm not going to tell you what kind exactly
Num bar(Bool x)
в ограниченный полиморфизм, и не ясно, как кодировать:
-- I can return any kind of Num, *you* tell *me* what kind
bar :: (Num a) => Bool -> a
в подтип.
Мое лучшее предположение для # 2 - то, что Scala должен общаться с Java, а Java говорит о подтипах. И потому что у Scala есть все особенности системы типов, известные человеку, потому что он думает, что это необходимо, чтобы быть крутым. : -Р