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)
похоже, делает это довольно сложным.
pigworker (Conor McBride) ранее привел пример Functor
, который не является Applicative
, но он полагался на pure
, чтобы сделать это, и который недоступен в Apply
.
** Затем я понял, что на самом деле может быть разумный (хотя и немного странный) экземпляр Apply
для Handler
, который концептуально собирает одновременные исключения.
Update
Эдвард Кметт теперь принял два дополнительных закона, предложенных мной для Apply
(для проверки оптимизаций, которые я сделал для экземпляра Apply (Coyoneda f)
),
x <.> (f <$> y) = (. f) <$> x <.> y
f <$> (x <.> y) = (f .) <$> x <.> y
Было бы интересно посмотреть, изменят ли эти дополнения ответ на этот вопрос.