Beachten Sie, dass wir keine leeren Bäume zulassen, und dass ein Blatt ist ein Baum mit einer leeren Liste von Unterbäumen.Haskell falten Betrieb am Baum
treeFold :: (a -> [b] -> b) -> Tree a -> b
treeFold f (Tree x s) = f x (map (treeFold f) s)
die oben genannten Informationen gegeben, die ich nicht verstehe, wie der Baum Falzfunktion ein Ergebnis zurückgibt, indem rekursiv die Falte Operation auf die Unterstrukturen Anwendung, dann an der Wurzel die Funktion zum Anbringen eines Etiketts und die Ergebnisse kehrte von den Unterbäumen zurück.
Ich bekomme auch nicht, wie die Tree Fold-Funktion nur ein Argument anstelle von 2, wenn es als Argument an die Kartenfunktion übergeben wird und es noch kompiliert und ordnungsgemäß ausgeführt wird. Beispiel: Die Baumgrößenfunktion unten zählt die Knoten des Baums. So
treeSize :: Tree a -> Int
treeSize = treeFold (\x ys -> 1 + sum ys)
laufen TreeSize Baum wo tree = Tree 4 [Tree 1 [Tree 2 [], Tree 3 []]]
die Größe des Baumes gibt als 4.
in der Baumgröße Funktion oben, der Baum Falzfunktion auch ein Argument übergeben wird statt zwei. Außerdem wird das x, das an die Tree-Fold-Funktion übergeben wird, nirgends verwendet, also warum brauchen Sie es dort? Wenn Sie das Programm entfernen, wird das Programm nicht kompiliert und die folgende Fehlermeldung wird angezeigt.
Couldn't match type `a' with `[[Int] -> Int]'
`a' is a rigid type variable bound by
the type signature for treeSize :: Tree a -> Int
at treeFold.hs:15:1
In the first argument of `sum', namely `ys'
In the second argument of `(+)', namely `sum ys'
In the expression: 1 + sum ys
Jede Hilfe würde sehr geschätzt werden.
[Warum funktionale Programmierung wichtig ist] (http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf). –