Ich schreibe einen kleinen Code für ein hw-Problem, der uns auffordert, eine Definition von tree eine Instanz von funktor und faltbar zu machen. Wenn ich den folgenden Code schreibe:
%Vor%Der folgende Fehler wird angezeigt:
%Vor%Wo gehe ich falsch?
Danke!
[[Update]]
Ich habe den Code entsprechend dem Vorschlag in der Antwort geändert. Hier ist ein Link zu dem Code mit dem Fehler. Es wäre toll, wenn sich jemand das anschaut und mir sagt, wo ich falsch liege.
Nochmals vielen Dank!
Sie können das nicht schreiben:
%Vor% weil Tree
ein Datentyp ist, kein Datenkonstruktor. In einem Mustervergleich können Sie nur Datenkonstruktoren verwenden, die in diesem Fall Leaf
oder Node
wären. Hier müssen Sie nicht einmal jeden Konstruktor für die untergeordneten Bäume abgleichen, da Sie die gesamte Liste trotzdem gerade durchlaufen:
Aber tatsächlich gibt es dort auch einen anderen Fehler. Das Ergebnis von fmap
muss immer noch ein Tree
sein, also müssen Sie das Ergebnis zurück in ein Node
:
genau wie Sie es bereits mit dem Leaf
case tun.
Sie können sich fmap
als etwas vorstellen, das die Werte innerhalb der Struktur ändert, ohne jedoch die Form der Struktur zu ändern. dh. Das Mapping über eine Liste ergibt eine Liste mit der gleichen Länge, und das Mapping über einen Baum sollte einen identischen Baum mit den gleichen Verzweigungen, aber mit unterschiedlichen Werten in den Blattknoten erzeugen.
Sie können sich ein fold
als etwas vorstellen, das die Struktur vollständig entfernt, und dann einen Weg findet, alle Werte von Blattknoten zu einem einzigen Wert zu kombinieren. Der Typ von foldMap
hilft:
Das Ergebnis von foldMap
sollte kein Tree
sein! Es sind nur die Werte, die mit der Mapping-Funktion transformiert und mit ihrer Monoid
-Instanz kombiniert wurden.
Tags und Links haskell functional-programming functor