Existe um Functor que não pode ser um Candidato cumpridor da lei?
A pergunta recente perguntou geralmente sobre os limites entre várias classes Haskell. eu vim comHandler
como um exemplo de um válidoFunctor
com nenhumsensato instancia deApply
**, Onde
class Functor f => Apply f where
(<.>) :: f (a -> b) -> f a -> f b
-- optional bits omitted.
No entanto, ainda não consegui encontrar um exemplo de um válidoFunctor
que não pode ser feitoválido caso (sem sentido) deApply
. O fato de queApply
tem tinha (ver atualização) mas uma única lei,
(.) <(.) <$> u <.> v <.> w = u <.> (v <.> w)
gt; u <.> v <.> w = u <.> (v <.> w)
parece tornar isso bastante complicado.
porco (Conor McBride) anteriormentedeu um exemplo de umFunctor
aquilo não éApplicative
, mas ele contou compure
para fazer isso, e isso não está disponível noApply
.
** Então, mais tarde, percebi que na verdade poderia haver um sentido (embora um pouco estranho)Apply
instância paraHandler
, que conceitualmente coleta exceções simultâneas.
Edward Kmett agoraaceitaram duas leis adicionais que propus paraApply
(para validar as otimizações que fiz noApply (Coyoneda f)
instância):
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
Seria interessante ver se essas adições alteram a resposta a essa pergunta.