Во-первых, этот вопрос не на 100% специфичен для Haskell, не стесняйтесь комментировать общий дизайн классов типов, интерфейсов и типов.
Я читаю LYAH - создание типов и классов типов Ниже приводится отрывок, по которому я ищу дополнительную информацию:
Data (Ord k) => Map k v = ...
Однако это очень сильное соглашение
в Haskell никогда не добавлять класс типов
ограничения в объявлениях данных. Зачем?
Ну, потому что мы не много выигрываем,
но мы заканчиваем тем, что пишем больше класса
ограничения, даже когда нам не нужно
их. Если мы ставим или не ставим орд к
ограничение в объявлении данных для
Карта k v, мы собираемся поставить
ограничение на функции, которые
предположим, что ключи на карте могут быть
приказал. Но если мы не ставим
ограничение в декларации данных, мы
не нужно ставить (Ord k) => в
объявления типов функций, которые
не волнует, могут ли ключи быть
заказано или нет. Пример такого
Функция ToList, которая просто берет
отображение и преобразует его в
ассоциативный список. Его тип подпись
is toList :: Map k a -> [(k, a)]. Если
Карта k v имела ограничение типа в
объявление данных, тип для toList
должно быть toList :: (Ord k) =>
Карта k a -> [(k, a)], хотя
функция не делает никакого сравнения
ключи по заказу.
Поначалу это кажется логичным - но разве нет возможности иметь присоединенный к типу класс типов? Если класс типов является поведением типа, то почему поведение должно определяться использованием типа (через функции), а не самого типа? Я предполагаю, что есть некоторое метапрограммирование, которое могло бы использовать это, и это, конечно, хорошая и описательная документация кода. И наоборот, будет ли это хорошей идеей на других языках? Будет ли идеально указывать интерфейс, которому объект должен соответствовать в методе, например, если метод не используется вызывающей стороной, объект не должен соответствовать интерфейсу? Более того, почему Haskell не может сделать вывод, что функция, использующая тип Foo
, должна использовать ограничения класса типов, определенные в объявлении типа Foo
? Есть ли прагма, чтобы включить это?
В первый раз, когда я прочитал его, он вызвал «ответ взлома (или обходной путь)». На втором чтении с некоторой мыслью, это звучало умно. В третьем прочтении, проведя сравнение с миром ОО, это снова прозвучало как хак.
Так вот и я.