Gibt es eine van Laarhoven-Darstellung von "Optional"?

15

Viele Arten von Optiken haben eine Van-Laarhoven-Darstellung.

Beispielsweise kann ein LensTyp Lens s t a b wie folgt dargestellt werden:

 Functor f => (a -> f b) -> s -> f t

In Traversalähnlicher Weise kann a auf ähnliche Weise dargestellt werden, wobei die FunctorEinschränkung gegen Folgendes ausgetauscht wird Applicative:

 Applicative f => (a -> f b) -> s -> f t

Mehrere Optik-Frameworks wie Monocle und Arrow definieren einen Typ namens Optional.

In Monocles Optik Optional passt die Erbe zwischen LensundTraversal

So wie ich es verstehe: Wenn a Traversalwie a ist Lens, das null bis viele Ziele haben kann, dann Optionalist a wie a Lens, das null bis eins Ziele haben kann.

In Monocle Optionalwird als ein Funktionspaar definiert:

getOrModify :: s -> Either t a 
set :: (b, s) -> t

Kommentare im Monocle-Quellcode legen nahe, dass es auch möglich ist, ein Optional"als schwächer PLensund schwächer PPrism" darzustellen.

Ist es möglich, eine Optionalals van Laarhoven-Funktion darzustellen?

Joe
quelle

Antworten:

10

Es würde eine Möglichkeit geben, dies darzustellen, wenn die Hierarchie von Functor / Applicative / Monad feinkörniger wäre. Bestimmtes:

class Functor f => Pointed f where
    pure :: a -> f a

type Optional s t a b = forall f. Pointed f => (a -> f b) -> s -> f t

Beachten Sie, dass der Typ wahrscheinlich Affinein der Objektivbibliothek benannt wird, wenn dies in der Klassenhierarchie korrekt ist.

Carl
quelle
1
Dies ist praktisch völlig in Ordnung für meinen Anwendungsfall, bei dem es sich um eine "nur zum Spaß" Scala Optics Library handelt, in der ich die Functor-Hierarchie von Grund auf neu geschrieben habe und daher damit machen kann, was ich will. Habe ich Recht, wenn ich denke, dass dies darauf hindeutet, dass wenn ich auch eine andere Typklasse zwischen Functorund Applicativemit liftA2, aber keine reine hätte, dann würde dies eine Optik mit einem bis vielen Zielen definieren? Hat das einen Namen?
Joe
1
Es deutet darauf hin. Ich habe keine Ahnung, wie die Optik heißen würde.
Carl
4
@ Joe Diese Zwischenklasse wird Applyim Paket "Semigroupoids" aufgerufen . hackage.haskell.org/package/semigroupoids-5.3.3/docs/…
danidiaz
2
... und die entsprechende Optik im lensPaket heißtTraversal1
Benjamin Hodgson
@Carl Wie können wir überprüfen, ob dies type Optional s t a btatsächlich die richtige Darstellung für diese Optik ist und ob alle entsprechenden Gesetze gelten? Dies scheint ein magischer Trick zu sein. Warum war es Pointedund nicht sagen Copointed? Wie können wir für eine andere gegebene Optik die richtige Darstellung des Professors erraten?
Winitzki