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