Почему стандартные библиотеки Haskell больше не используют полиморфизм? - PullRequest
28 голосов
/ 24 января 2011

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

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

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

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

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

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

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

Ответы [ 4 ]

19 голосов
/ 24 января 2011

Существует очень хорошая прагматическая причина, по которой «стандартный» Haskell (Prelude + base +, возможно, еще немного) не использует больше полиморфизма:

Проектирование классов типов общего назначения: hard . Хорошие проекты для классов, которые абстрагируются над типами контейнеров, такими как списки, массивы и «строки байтов» (лично я на самом деле не считаю Bytestring контейнером), не плавают в ожидании включения в Haskell 2012. Есть некоторые проекты, например Listlike и Занятия по Эдисону и ряд людей решили эту проблему, но, за исключением Foldable и Traversable, никто не создал убедительных дизайнов.

11 голосов
/ 25 января 2011

Раньше базовая библиотека Haskell была более полиморфной - списочные понимания, используемые для работы с любой монадой, map и ++ не были ограничены List и, возможно, другими вещами.

Но в то время люди думали, что это приводит к запутанным сообщениям об ошибках для новичков, и что люди, которые не являются новичками, могут использовать специально полиморфные версии.

8 голосов
/ 24 января 2011
  1. Несмотря на то, что в основе есть много вещей, в частности, Prelude, они являются историческими, я думаю, что любое обобщение повлечет за собой множество технических отступлений.Основная проблема - это скорость - если у вашей функции есть ограничение класса типа, то вы будете передавать словарь для функций класса типа и, возможно, будете использовать больше места для специализации.

  2. Некоторые библиотеки, такие как SYB, используют расширения, которые не являются частью Haskell.Первой задачей будет формализация и поддержка этих функций.Посмотрите документы на Haskell, чтобы увидеть, куда движется Haskell и как вы можете повлиять на этот путь.

6 голосов
/ 24 января 2011

Реальный мир У Haskell есть некоторые идеи об этом в главе Monad Transformers :

В идеальном мире, мы бы сделали выход из прошлого и переключились бы на Preludeиспользовать Traversable и Foldable типы?Возможно нет.Изучение Haskell уже является достаточно стимулирующим приключением для новичков.Абстракции Foldable и Traversable легко подобрать, когда мы уже понимаем функторы и монады, но они поставили бы ранних учеников на слишком чистую диету абстракции.Для обучения языку хорошо, что карта работает со списками, а не с функторами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...