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

Ограничения по типу на объявления данных

По-видимому, это плохая идея поместить ограничение типа typeclass на объявление данных [src], [SRC].

Я лично не сталкивался с желанием ограничить типы внутри типов данных, которые я создал, но мне не кажется очевидным, почему разработчики языка "решили, что это была плохая идея". Почему это?

4b9b3361

Ответ 1

Я лично не сталкивался с желанием ограничить типы внутри типов данных, которые я создал, но мне не кажется очевидным, почему разработчики языка "решили, что это была плохая идея". Почему это?

Потому что это вводило в заблуждение и полностью отступало от того, что на самом деле было бы полезно.

В частности, он фактически не ограничивал типы в типе данных так, как вы, вероятно, ожидаете. То, что оно делало, было связано с ограничением класса на самом конструкторе данных, а это означало, что вам нужно было удовлетворить экземпляр при построении значения... но это все.

Так, например, вы не могли бы просто определить двоичное дерево поиска с ограничением Ord, а затем знать, что любое дерево имеет отсортированные элементы; для функций поиска и вставки все равно потребуется ограничение Ord. Все, что вы могли бы предотвратить, было бы создание пустого дерева, которое "содержит" значения некоторого неупорядоченного типа. Что касается соответствия шаблону, то вообще не было ограничений на содержащийся тип.

С другой стороны, люди, работающие над Haskell, не думали, что разумная версия (которую люди склонны предполагать контексты типа данных) была плохой идеей вообще! На самом деле ограничения класса на тип данных объявленный с синтаксисом GADT (обобщенные типы алгебраических данных, включенные в GHC с GADTs языковой прагмой) работа очевидным образом - вам нужно ограничение для построения значения, и соответствующий экземпляр также сохраняется в GADT, так что вам не нужно ограничение для работы со значениями, а сопоставление шаблонов в конструкторе GADT позволяет вы используете экземпляр, который он захватил.

Ответ 2

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

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

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

Это гарантирует, что вы не можете поместить данные в свой тип данных, если вы не можете сделать определенные вещи с ним. Это полезно. Вы не будете создавать программирование faux pas, используя один, и это неплохая практика, это просто не так прекрасно, как они хотели.

"Плохая идея разрешить", вероятно, потому, что GADT действительно то, что они хотели бы. Если бы GADT были в первую очередь, они бы этого не сделали.

Я не думаю, что это так плохо, что есть оба. Если вы хотите состояние манипулируя функцией, вы можете использовать постоянно явный параметр, который вы проходите, или вы можете использовать монаду и сделать ее неявной. Если вы хотите ограничить данных, вы можете использовать явно явный текст в объявлении данных или неявный с GADT. GADT и монады более сложны, но это не делает явные параметры или ограничения типа данных неверны.