Почему стандартные библиотеки Haskell больше не используют полиморфизм?
Я участвую в процессе обучения Haskell, и классы типов кажутся мощным способом создания полиморфных функций, безопасных для типа. Но многие функции Haskell Prelude не используют их. Более конкретно:
-
Большинство функций списка не работают с другими структурами данных (например, foldr
и length
реализованы только для списков и не могут использоваться на массивах).
-
Модули типа Data.ByteString
непригодны для использования, если вы не используете import qualified
, поскольку они включают функции, которые имеют те же имена, что и функции Prelude.
Кажется, что обе эти проблемы исчезнут, если стандартная библиотека использует общие функции с типами классов (пожалуйста, дайте мне знать, если я полностью не согласен с этим).
У меня есть два вопроса:
-
Есть ли технические или дизайнерские
причины, по которым Прелюдия такова, или это просто для
исторических причин?
-
Оглядываясь, похоже, что есть
несколько библиотек (например,
Data.Foldable
и, если я не
ошибочно, ломайте свою котельную)
которые заменяют стандартные функции Prelude
с универсальными альтернативами. Находятся
есть ли планы включить эти идеи в будущие версии Haskell?
Ответы
Ответ 1
Существует очень хорошая прагматическая причина, что "стандартный" Haskell (Prelude + base +, возможно, еще немного) не использует больше полиморфизма:
Разработка классов типа общего назначения жестко. Хорошие проекты для классов, которые абстрагируются над типами контейнеров, такими как списки, массивы и "байты" (лично я действительно не рассматриваю Bytestring контейнер) не плавают, ожидая включения в Haskell 2012. Существуют некоторые проекты, например Listlike и Эдисон, а также ряд людей ушли от проблемы, но кроме Складных и Траверсируемых никто не создал никаких убедительных проектов.
Ответ 2
Базовая библиотека Haskell, которая использовалась для использования в большинстве монадов, map
и ++
, не была ограничена List и, возможно, другими вещами.
Но люди в то время думали, что это привело к запутанным сообщениям об ошибках для новичков и что люди, которые не являются новичками, могут использовать специально полиморфные версии.
Ответ 3
-
Хотя в базе есть много вещей и, в частности, Prelude, которые являются историческими, я думаю, что любое обобщение увидит много технического отталкивания. Основная проблема - скорость - если у вас функция есть ограничение типа класса, тогда вы будете проходить вокруг словаря для функций класса типа и, возможно, больше места для специализации.
-
Некоторые библиотеки, такие как SYB, используют расширения, которые не являются частью Haskell. Первой задачей было бы формализовать и построить поддержку этих функций. Посмотрите документы Haskell, чтобы узнать, куда идет Haskell, и как вы можете влиять на этот путь.
Ответ 4
В Real World Haskell есть некоторые сведения об этом в главе Monad Transformers:
В идеальном мире мы могли бы сделать перерыв в прошлом и переключиться на Prelude, чтобы использовать Traversable и Foldable типы? Возможно нет. Обучение Haskell уже является достаточно привлекательным приключением для новичков. Складные и обходные абстракции легко подбирать, когда мы уже понимаем функторов и монадов, но они ставят ранних учеников на слишком чистую диету абстракции. Для обучения языку хорошо, что карта работает по спискам, а не по функторам.