Was wäre die "eindeutige Methode", die Traversable zusätzlich zu Foldable hat?

8

Foldable ist eine Oberklasse von Traversable , ähnlich wie Functor ist eine Oberklasse von Applicative und Monad .

Ähnlich wie im Fall von Monad , wo es möglich ist, fmap als

zu implementieren %Vor%

wir könnten auch foldMap als

emulieren %Vor%

mit der Monoid m => (,) m Monade. Die Kombination von Superklasse und Methoden bringt also in beiden Fällen eine gewisse Redundanz mit sich.

Im Falle von Monaden kann argumentiert werden, dass eine "bessere" Definition der Typklasse wäre (Ich werde applicativ / monoid überspringen)

%Vor%

zumindest wird das in der Kategorientheorie verwendet. Diese Definition ermöglicht, ohne die Oberklasse Functor zu verwenden, nicht liftM , also ohne diese Redundanz.

Ist eine ähnliche Transformation für die Klasse Traversable möglich?

Um zu verdeutlichen: Was ich möchte, ist eine Neudefinition, nennen wir es,

%Vor%

, so dass wir die tatsächlichen Traverse Methoden Top-Level-Funktionen

machen könnten %Vor%

aber es wäre nicht möglich, generisch

zu machen %Vor%

Ich frage nicht, weil ich dies für etwas bestimmtes brauche; Es ist eine konzeptionelle Frage, um den Unterschied zwischen Foldable und Traversable besser zu verstehen. Ähnlich wie Monad vs Functor : während >>= ist viel bequemer als join für die tägliche Haskell Programmierung (weil Sie normalerweise genau diese Kombination von fmap und join benötigen ), letzteres macht es einfacher zu begreifen, worum es bei einer Monade geht.

    
leftaroundabout 13.01.2014, 01:25
quelle

2 Antworten

3

Foldable ist bis Functor as Traversable ist bis Monad , dh Foldable und Functor sind Oberklassen von Monad und Traversable (modulo alle applicative / monad Vorschlagsrauschen).

Tatsächlich ist das schon im Code

%Vor%

Also, es ist nicht klar, was es mehr zu wollen gibt. Foldable wird durch toList :: Foldable f => f a -> [a] gekennzeichnet, während Traversable letztlich davon abhängt, dass man den Inhalt nicht nur wie eine Liste wie toList abstrahieren kann, sondern auch die Form

extrahieren kann %Vor%

und rekombiniere sie dann

%Vor%

was von traverse abhängt.

Weitere Informationen zu dieser Immobilie finden Sie unter diesem Blogbeitrag von Russell O'Connor .

    
J. Abrahamson 13.01.2014, 03:42
quelle
3

Super Hand-wellig, weil es zu spät ist, aber die zusätzliche Kraft, die Traversable über Foldable hat, ist eine Möglichkeit, die ursprüngliche Struktur zu rekonstruieren. Zum Beispiel mit Listen:

%Vor%

Ich denke, dass myTraverse sich genauso verhält wie traverse , wobei nur die Klassen Applicative , Foldable und Monoid verwendet werden. Sie könnten es neu schreiben, um foldr anstelle von foldMap zu verwenden, wenn Sie Monoid loswerden wollten.

Listen sind einfach, weil sie eine flache Struktur sind. Allerdings vermute ich stark, dass Sie einen Zipper verwenden könnten, um die richtige Rekonstruktionsfunktion für jede Struktur zu erhalten (da Zipper generisch ableitbar sind, sollten sie immer existieren).

Aber selbst mit einem Reißverschluss haben Sie keine Möglichkeit, diese Struktur dem Monoid / der Funktion zuzuordnen. Es scheint, dass Traversable etwas wie

hinzufügt %Vor%

Das scheint sich mit Foldable stark zu überlappen, aber ich denke, das ist unvermeidlich, wenn man versucht, die Pfade ihren konstituierenden Werten zuzuordnen.

    
John L 13.01.2014 09:59
quelle

Tags und Links