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
Было бы интересно посмотреть, изменят ли эти дополнения ответ на этот вопрос.