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
wir könnten auch foldMap
als
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
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.
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
und rekombiniere sie dann
%Vor% was von traverse
abhängt.
Weitere Informationen zu dieser Immobilie finden Sie unter diesem Blogbeitrag von Russell O'Connor .
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:
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
Das scheint sich mit Foldable
stark zu überlappen, aber ich denke, das ist unvermeidlich, wenn man versucht, die Pfade ihren konstituierenden Werten zuzuordnen.
Tags und Links haskell fold containers