У меня возник этот вопрос в глубине души с тех пор, как я увидел определение естественных преобразований в старом пакете дополнительных категорий Эдварда Кметта:
-- | 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. ж а -> г а. Что можно было бы записать с помощью следующего синонима типа.
type Nat f g = forall a. f a -> g a
Это было пощечиной моему отношению «я продолжу игнорировать это». Итак, на вопрос: почему можно внезапно отказаться от ограничений функтора?
Nat
, вы будете предоставлять типы. Сам по себе синоним типа не использует того факта, что они являются функторами. Только когда вы его используете, это имеет значение, если в этом есть смысл. - person David Young   schedule 18.02.2014forall
сам по себе уменьшает количество неестественных функций преобразования, которые вы можете определить, даже если рассматриваемые функторы изначально не очевидны / не бросаются в глаза. - person AndrewC   schedule 18.02.2014f
иg
должны быть полиморфными, но это не то же самое, что быть функтором. Что мне не хватает? И спасибо за ссылку; быстрое прочтение не развеяло мои сомнения, но оно действительно кажется очень интересным. - person user2141650   schedule 18.02.2014f
иg
не обязательно должны быть полиморфными (если вы говорите о конкретном естественном преобразовании). Например, мы можем говорить о естественном преобразованииsafeHead :: Nat [] Maybe
.a
должен быть полиморфным и универсальным, чтобы быть естественным. - person David Young   schedule 19.02.2014natPromap :: Nat f g -> (g a -> f b) -> (f a -> g b)
. Таким образом, нам нужно установить ограничение Functor только тогда, когда мы действительно используемfmap
. - person David Young   schedule 19.02.2014f
(иg
) должны быть полиморфными, т.е. принимать любыеa
, а не то, чтоNat
должно быть. Я думаю, мы просто по-другому используем нашу терминологию. - person user2141650   schedule 19.02.2014Functor
. НекоторыеContravariant
экземпляры, например - person David Young   schedule 22.02.2014forall
), а неf
иg
. - person AndrewC   schedule 22.02.2014eta :: F a -> G a
, а условие становится условием для любой функцииh::a->b
,eta.fmap h = fmap h.eta
. С типами это(eta::F b -> G b) . ((fmap h)::F a -> F b) = ((fmap h)::G a -> G b) . (eta::F a -> G a)
. Это условие any строго ограничивает, какие функции могут представлять преобразования, согласно статье. - person AndrewC   schedule 22.02.2014