Подтвердить что ты не робот

Почему стандартные библиотеки Haskell больше не используют полиморфизм?

Я участвую в процессе обучения Haskell, и классы типов кажутся мощным способом создания полиморфных функций, безопасных для типа. Но многие функции Haskell Prelude не используют их. Более конкретно:

  • Большинство функций списка не работают с другими структурами данных (например, foldr и length реализованы только для списков и не могут использоваться на массивах).

  • Модули типа Data.ByteString непригодны для использования, если вы не используете import qualified, поскольку они включают функции, которые имеют те же имена, что и функции Prelude.

Кажется, что обе эти проблемы исчезнут, если стандартная библиотека использует общие функции с типами классов (пожалуйста, дайте мне знать, если я полностью не согласен с этим).

У меня есть два вопроса:

  • Есть ли технические или дизайнерские причины, по которым Прелюдия такова, или это просто для исторических причин?

  • Оглядываясь, похоже, что есть несколько библиотек (например, Data.Foldable и, если я не ошибочно, ломайте свою котельную) которые заменяют стандартные функции Prelude с универсальными альтернативами. Находятся есть ли планы включить эти идеи в будущие версии Haskell?

4b9b3361

Ответ 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 уже является достаточно привлекательным приключением для новичков. Складные и обходные абстракции легко подбирать, когда мы уже понимаем функторов и монадов, но они ставят ранних учеников на слишком чистую диету абстракции. Для обучения языку хорошо, что карта работает по спискам, а не по функторам.