Альтернативные реализации стандартных классов библиотек на языке Haskell - PullRequest
20 голосов
/ 20 апреля 2011

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

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

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

  3. Существуют ли альтернативные реализацииклассы базовых типов (особенно стрелки, монады, аппликативные и т. д.), которые реализуют «правильный» набор зависимостей классов?

Ответы [ 4 ]

18 голосов
/ 20 апреля 2011

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

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

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

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

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

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

5 голосов
/ 22 апреля 2011

В недавнем обсуждении этого вопроса в списке простых чисел на Хаскеле было . Я думаю, что из этого следует, что для того, чтобы произошло изменение иерархии, сначала нужно было реализовать предложение Йона Фэрбэрна, который исправляет очень, очень важный пункт 1 из списка @ camccan: класс типов может дать реализации по умолчанию для своих определений суперкласса. Я не знаю какой-либо реализации или даже наполовину формальной спецификации этого предложения.

Тип синонимов класса fix point # 2, Context bloat. Обратите внимание, что вы уже можете это сделать, если вы хорошо используете UndecidableInstances (а GHC расширяет синоним каждый раз, когда выводится тип ...)

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

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

2 голосов
/ 17 мая 2011
  1. Я выступаю против альтернативного существования, а также я не могу взять кредит на предложение, которое связано с иерархиями Applicative-Functor-Monad.Несколько лет назад я бормотал о необходимости математически звука Прелюдии.

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

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

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

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

  2. Вышеупомянутое предложение включает меры по поддержке обратной совместимости, но кажется, что оно не было бы идеальным каким-либо образом.

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

...