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

Альтернативные реализации классов классов стандартной библиотеки Haskell

Я видел, как многие люди жаловались на некоторые типы классов из стандартной библиотеки, говоря такие вещи, как "Monad должен требовать" Functor "или даже" Monad должен требовать аппликативного "," Аппликация должна требовать Pointed "," Num не должен require Show "и т.д. Итак, у меня есть несколько вопросов:

  • Есть ли аргументы в отношении того, как дерево зависимостей типа типа имеет эти "недостатки", воспринимаемые сообществом, или это просто результат того, как дела обстояли исторически?

  • Насколько сильно изменение в этом сломало бы существующий код?

  • Существуют ли альтернативные реализации классов базового типа (в частности, стрелки, монады, аппликативные и т.д.) вокруг того, что реализует "правильный" набор зависимостей классов?

4b9b3361

Ответ 1

Помимо обратной совместимости, есть некоторые (в основном косметические, но утомительные для решения) проблемы из-за довольно простого способа, которым Haskell относится к классам типов:

Отсутствие неявного определения: Monad полностью определяется только pure и (>>=); fmap и (<*>) могут быть записаны в терминах этих. В "правильной" иерархии каждый экземпляр должен быть выписан. Это не так уж плохо в этом случае, но по мере увеличения гранулярности число экземпляров, каждое из которых добавляет небольшую функцию. Это существенно упростило бы ситуацию, если бы определения классов могли предоставлять стандартные реализации для функций суперкласса с точки зрения их собственных функций, так что функции типа (>>=), которые полностью охватывают несколько функций в суперклассах, могут служить определением для всей соответствующей иерархии.

Контекст bloat. Поскольку существует "причина", для которой Num требуется Show и Eq, это потому, что печать и сравнение равенства чисел довольно распространены. Они строго ортогональны, но разделение их означает, что функции, выполняющие все три вещи, теперь должны указать все три класса в своем типе. Это технически хорошо, но, опять же, по мере того, как увеличивается гранулярность, так будут функционировать подписи типов.

Монолитные зависимости: иерархия классов типов и их суперклассов может быть добавлена, но не изменена или не заменена. Если часть кода считает необходимостью заменить свою собственную версию какого-либо обычного типа, скажем, используя что-то вроде этого вместо Monad - иерархия обрезана в этой точке; совместимость с кодом с использованием других определений Monad должна быть предоставлена ​​вручную до некоторой степени, а классы классов, построенные поверх другого определения, должны быть переопределены или переведены, даже если они зависят только от подмножества поведения, которое разделяет оба определения.

Нет четкой иерархии. Как видно из вышеизложенного, в детализации классов есть выбор. Например, действительно ли существует Pointed или существует только Applicative? Здесь нет никакого ответа, что универсально идеально, и не должно быть.

Я подозреваю, что усилия по замене существующих классов классов лучше обслуживать, сначала устраняя вышеупомянутые проблемы, после чего замена классов классов будет гораздо менее болезненной или даже немного большей, чем формальность. Предложение синонимов типа типа, которое, например, упоминает @luqui, будет важным шагом в этом направлении.

Ответ 2

В недавнем обсуждении математическая Num -иерархия. Решение этого (альтернативные подклассы?) Имеет справедливую вероятность решения # 3 на этом пути.

В любом случае, я думаю, что эта попытка стоит того, что те изменения, которые были внесены в Haskell (не только в иерархию), определенно сделают код Haskell и Haskell более гибким и, таким образом, вытащит ковер под nay-sayer.

Ответ 3

  • Я выступаю против викарийного существования, а также не могу взять на себя ответственность за предложение, которое связано с иерархиями Applicative-Functor-Monad. Я много лет назад говорил о необходимости математически sound Prelude.

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

    Одно большое преимущество наличия математической иерархии с конструктивной системой доказательства математики заключается в том, что мы можем извлекать программы из доказательств через изоморфизм Карри-Говарда. Для тех, кто заинтересован в правильности программы и автоматической проверке, прямые переводы между классами Haskell и инструментами проверки доказательств, такими как Coq, являются отличными.

    В настоящее время я использую пакет hmatrix и друзей. К сожалению, я не думаю, что он хорошо играет с текущей цифровой прелюдией по хаке. В идеале, чтобы использовать оптимизированные библиотеки BLAS и LAPACK в общем коде, нужно просто реализовать интерфейс typeclass, указанный в числовой прелюдии.

Ответ 4

  • Некоторые неопознанные лица или лица (действующие через Вивиан МакФейл) предложили реформу этой области прелюдии и откройте их предложение: "Стандартная иерархия классов является следствием исторического развития Хаскелла, а не логики". Верно это или нет, я не могу сказать.

  • В вышеизложенное предложение включены меры по поддержке обратной совместимости, но похоже, что это не будет совершенным ни в коем случае.

  • Была небольшая, но славная попытка создать "Другая прелюдия" , чтобы убрать некоторые беспорядки.