Есть ли Функтор, который не может быть законопослушным?
A недавний вопрос обычно спрашивают о границах между различными классами Haskell. Я придумалHandler
в качестве примера действительногоFunctor
безздравомыслящий экземплярApply
**, где
class Functor f => Apply f where
(<.>) :: f (a -> b) -> f a -> f b
-- optional bits omitted.
Тем не менее, я еще не смог найти пример действительногоFunctor
это не может быть сделанодействительный (если бессмысленно) экземплярApply
, Дело в том, чтоApply
имеет был (см. обновление), но один закон,
(.) <(.) <$> u <.> v <.> w = u <.> (v <.> w)
gt; u <.> v <.> w = u <.> (v <.> w)
кажется, сделать это довольно сложно.
свиновод (Конор МакБрайд) ранеедал пример изFunctor
это неApplicative
, но он полагался наpure
сделать это, и это не доступно вApply
.
** Позже я понял, что на самом деле может быть разумным (хотя и немного странным)Apply
экземпляр дляHandler
, что концептуально собирает одновременные исключения.
Эдвард Кметт теперьпринято два дополнительных закона, которые я предложил дляApply
(чтобы подтвердить оптимизацию, которую я сделал дляApply (Coyoneda f)
пример):
x <.> (f <x <.> (f <$> y) = (. f) <$> x <.> y
f <$> (x <.> y) = (f .) <$> x <.> y
gt; y) = (. f) <x <.> (f <$> y) = (. f) <$> x <.> y
f <$> (x <.> y) = (f .) <$> x <.> y
gt; x <.> y
f <x <.> (f <$> y) = (. f) <$> x <.> y
f <$> (x <.> y) = (f .) <$> x <.> y
gt; (x <.> y) = (f .) <x <.> (f <$> y) = (. f) <$> x <.> y
f <$> (x <.> y) = (f .) <$> x <.> y
gt; x <.> y
Было бы интересно посмотреть, изменят ли эти дополнения ответ на этот вопрос.