Не только в этом различие. Ответ - в обоих случаях различие в контракте, который на типах немного не передать.
В случае Iterable мы не особо запариваемся с понятием немедленных и промежуточных операций. В случае Sequence нам это важно.
Т.е. в теории конечно можно было всё затолкать в Iterable и там было был куча расширений xEager/xLazy. Но можно задать два интерфейса с разной идеей, хоть и совпадающей сигнатурой.
Ну с итераблами вообще всё странно.
Например, я хотел бы, чтобы List.map
возвращал MappedList
, где значения в ячейках вычисляются по мере доступа. Потому что лист, который я мапплю, может оказаться ещё не вычисленным.