Falten ohne Monoid-Instanz

8

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?

    
saidelmark 08.11.2013, 01:49
quelle

1 Antwort

9

Wenn Sie den Typ für foldMap

untersuchen %Vor%

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").

%Vor%

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

%Vor%

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.

    
J. Abrahamson 08.11.2013, 01:51
quelle

Tags und Links