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