Ответ 1
Стало ясно, что этот ответ неверен. Я оставляю его здесь, чтобы сохранить ценную дискуссию в комментариях, пока кто-то не сформулирует правильный ответ.
Рассмотрим набор мощности в Set
. Если у нас есть функция f : S -> T
, мы можем образовать f' : PS S -> PS T
на f' X = f [X]
. Хороший ковариантный функтор (я думаю). Мы могли бы также сформировать f'' X = f^(-1) [X]
, хороший контравариантный функтор (я думаю).
Посмотрите на "power set" в Haskell:
newtype PS t = PS (t -> Bool)
Это не Functor
, а только Contravariant
:
instance Contravariant PS where
contramap f (PS g) = PS (g . f)
Мы это признаем, потому что t
находится в отрицательном положении. В отличие от Set
, мы не можем получить "элементы" характеристических функций, составляющих набор мощности, поэтому ковариантный функтор недоступен.
Я бы предположил, что причина, по которой Хаскелл допускает свободную монаду для каждого ковариантного функтора, состоит в том, что она исключает те ковариантные функторы, которые вызывают проблемы для Set
.