Можно ли моделировать классы на уровне типов с типами более высокого ранга?

У меня есть подключаемая программа проверки типов во время выполнения, которая поддерживает параметрический, но не специальный полиморфизм, потому что нет шага компиляции и информация о типе стирается, как только отключается средство проверки типов.

Теперь я недавно пришел к идее переопределить классы типов с явным типом, чтобы я получил некоторые из их преимуществ без необходимости полностью включать базовый механизм в средство проверки типов:

data Functor f = Functor {fmap :: forall a b. (a -> b) -> f a -> f b}

mapList = Functor map
fmap (mapList) (+1) [1,2,3]

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

Верно ли мое предположение, и, поскольку я новичок на Haskell, мой явный тип функторов имеет какие-либо преимущества перед простым использованием map напрямую?

1 ответ

Решение

Идея представления класса с помощью типа данных в основном представляет собой словарь, который на самом деле во многом так или иначе реализует классы типов в GHC: полиморфная функция / значение с ограничениями

f :: Functor f => Y

во время выполнения представлена ​​функцией

_f_ :: FunctorDict f -> Y

где FunctorDict по сути ваш Functor Ранг 2-ADT (или GADT).

Главное, что является особенным в реальных классах типов, это то, что эти словари имеют свойство singleton: для каждого конструктора типов Fможет быть только один instance Functor Fв то время как вы можете в принципе иметь несколько разных FunctorDict F ценности. Иногда это может быть преимуществом, но часто это просто бремя, потому что вам нужно явно нести эти словари (GHC может просто выбрать их автоматически, потому что выбор однозначен), и законы сложнее сформулировать.

Другие вопросы по тегам