Baum als Instanz von funktor und faltbar

8

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!

    
user2994154 14.11.2013, 22:27
quelle

1 Antwort

8

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:

%Vor%

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 :

setzen %Vor%

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:

%Vor%

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.

    
Peter Hall 14.11.2013 22:32
quelle