Ich habe eine einfache Baumstruktur:
%Vor%Und eine Faltbare Implementierung:
%Vor% Und es funktioniert, obwohl es für Monoid
keine Implementierung gibt und ich weder mappend
noch mempty
in meinem Code verwenden kann. Wie funktioniert diese Foldable
Implementierung?
Wenn Sie den Typ für foldMap
Sie werden sehen, dass es einen ungebundenen Typ m
hat. Im Allgemeinen bedeutet dies, dass m
alles sein kann, aber hier wird auch m
mit Monoid m
eingeschränkt. Daraus ergibt sich die Monoid
.
Es ist erwähnenswert, dass es, wenn wir die Monoid
-Instanz nicht hatten, ziemlich schwierig ist, eine Funktion zu definieren, die einen Wert zurückgibt, der "alles Mögliche" sein kann. Wenn Sie es versuchen, werden Sie feststellen, dass es fast unmöglich ist (ohne "Betrug").
Aber es ist ziemlich einfach, wenn wir etwas über den Typ wissen
%Vor%Betrachten Sie als weiteren Beispiel den Typ des Ausdrucks
%Vor% Da dieser Ausdruck auf einem unbekannten Wert m
basiert und nur die Funktionen in der Monoid
-Klasse oder ihren Derivaten verwendet, spiegelt der Typ dies wider. Der allgemeinste Typ von expr
ist
Auch hier ist m
eine freie Typvariable, die auf einige Monoid
beschränkt ist.
Der Grund foldMap
lässt Sie Monoid
functions verwenden, weil es explizit die Arten von Dingen einschränkt, die der m
in seiner Typ-Signatur sein kann. Indem wir Beschränkungen dort setzen, gewinnen wir mehr Macht, sie zu manipulieren.