¿Hay un Functor que no puede ser un aplicante respetuoso de la ley?
A pregunta reciente preguntó generalmente sobre los límites entre varias clases de Haskell. se me ocurrioHandler
como ejemplo de un validoFunctor
con ningúnsensato en vez deApply
**, dónde
class Functor f => Apply f where
(<.>) :: f (a -> b) -> f a -> f b
-- optional bits omitted.
Sin embargo, todavía no he podido encontrar un ejemplo de un válidoFunctor
eso no se puede hacer unválido (si no tiene sentido) instancia deApply
. El hecho de queApply
tiene tenía (ver actualización) pero una sola ley,
(.) <(.) <$> u <.> v <.> w = u <.> (v <.> w)
gt; u <.> v <.> w = u <.> (v <.> w)
Parece que esto es bastante complicado.
trabajador porcino (Conor McBride) anteriormentedio un ejemplo de unFunctor
eso no esApplicative
, pero confió enpure
para hacerlo, y eso no está disponible enApply
.
** Luego, me di cuenta de que en realidad podría ser sensible (aunque un poco extraño)Apply
instancia paraHandler
, que conceptualmente recoge excepciones simultáneas.
Edward Kmett tiene ahoraaceptado dos leyes adicionales que propuse paraApply
(para validar las optimizaciones que hice alApply (Coyoneda f)
ejemplo):
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
Sería interesante ver si estas adiciones cambian la respuesta a esta pregunta.