Ist da ein Functor, der kein gesetzestreuer Bewerber sein kann?

A recent question fragte allgemein nach den Grenzen zwischen verschiedenen Haskell-Klassen. Ich hatte die Idee dassHandler als Beispiel für ein gültigesFunctor ohnesinnvol Instanz vonApply**, w

class Functor f => Apply f where
  (<.>) :: f (a -> b) -> f a -> f b
  -- optional bits omitted.

Ich konnte jedoch noch kein Beispiel für ein gültiges @ findeFunctor das kann nicht zu einem @ gemacht werdgülti (wenn sinnlos) Instanz vonApply. Die Tatsache, dassApply ha hatte (siehe Update) aber ein einziges Gesetz,

(.) <
(.) <$> u <.> v <.> w = u <.> (v <.> w)
gt; u <.> v <.> w = u <.> (v <.> w)

scheint das ziemlich knifflig zu machen.

pigworker (Conor McBride) zuvor gab ein Beispiel einesFunctor das ist nichtApplicative, aber er verließ sich aufpure, um dies zu tun, und das ist nicht verfügbar inApply.

** Dann habe ich später gemerkt, dass es tatsächlich einen vernünftigen (wenn auch etwas seltsamen) @ geben könnApply Instanz fürHandler, das konzeptionell gleichzeitige Ausnahmen sammelt.

Aktualisiere

Edward Kmett hat jetztakzeptier zwei zusätzliche Gesetze, die ich für @ vorgeschlagen haApply (um Optimierungen zu validieren, die ich an @ vorgenommen habApply (Coyoneda f) instance):

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

s wäre interessant zu sehen, ob diese Zusätze die Antwort auf diese Frage verändern.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage