История изменений
Исправление monk, (текущая версия) :
Свежий GHC старые библиотеки не собирает? А почему? Обратную совместимость регулярно ломают?
Да. В основном на уровне базовой библиотеки. Всё равно, что в Си в 1990 взяли и поменяли бы во всей стандартной библиотеке char* на struct string { char *begin, *end; }.
Справедливости ради, неизменность АПИ может значить как стабильность, так и отсутствие развития.
Скорее демонстрация проблемы с отсутствием инкапсуляции в Haskell. Разделили, например, класс типов Monad на Monad и Applicative: всем надо переписать свои монады (https://wiki.haskell.org/Functor-Applicative-Monad_Proposal). Для ООП выделение из класса базового суперкласса проходит бесследно для кода, использующего класс. Для Racket вообще модуль предоставляет именно API с полным сокрытием деталей реализации: недавно полностью заменили потроха на Chez Scheme, но API осталось без изменений. В Haskell можно было сохранить API создав новые классы типов (Monad2, MonadPlus2, …), но это похоронило бы язык ещё быстрее.
Исходная версия monk, :
Свежий GHC старые библиотеки не собирает? А почему? Обратную совместимость регулярно ломают?
Да. В основном на уровне базовой библиотеки. Всё равно, что в Си в 1990 взяли и поменяли бы во всей стандартной библиотеке char* на struct string { char *begin, *end; }.
Справедливости ради, неизменность АПИ может значить как стабильность, так и отсутствие развития.
Скорее демонстрация проблемы с отсутствием инкапсуляции в Haskell. Разделили, например, класс типов Monad на Monad и Applicative: всем надо переписать свои монады (https://wiki.haskell.org/Functor-Applicative-Monad_Proposal). Для ООП выделение из класса базового суперкласса проходит бесследно для кода, использующего класс. Для Racket вообще модель предоставляет именно API с полным сокрытием деталей реализации: недавно полностью заменили потроха на Chez Scheme, но API осталось без изменений. В Haskell можно было сохранить API создав новые классы типов (Monad2, MonadPlus2, …), но это похоронило бы язык ещё быстрее.