Где функтор в естественной трансформации?
У меня был этот вопрос в глубине души с тех пор, как я увидел определение естественных преобразований в старом пакете "дополнительные функции" Эдварда Кметта:
-- | A natural transformation between functors f and g.
type f :~> g = forall a. f a -> g a
Но теперь, читая сообщение в блоге Стивена Диля о дополнениях, я нахожу это:
Естественным преобразованием в нашем контексте будет полиморфная функция, связанная с двумя экземплярами функтора Haskell f и g с сигнатурой типа (Functor f, Functor g) => forall a. f a -> g a. Который может быть написан со следующим синонимом типа.
type Nat f g = forall a. f a -> g a
Который был пощечиной моему отношению "я буду продолжать игнорировать это". Итак, на вопрос: почему нормально внезапно отбрасывать ограничения функтора?
1 ответ
В Haskell не разрешено накладывать ограничение на синоним типа. И даже для типов данных это устарело в Haskell 2010. Вместо этого следует накладывать ограничение на функции, которые работают со значениями этого типа.