My Custom Art ist:Mustervergleich auf benutzerdefinierten Konstrukteuren Haskell
data Tree a = Leaf a | Node [Tree a] deriving (Show, Eq)
ich eine Funktion
foo :: Eq a => a -> Tree a -> [Tree a]
Beispiel
foo 3 (Node [Leaf 1, Leaf 3, Node [Leaf 5, Leaf 3, Leaf 6], Leaf 4, Leaf 3, Leaf 44, Leaf 3])
-- this should print [Node [leaf 5, leaf 3, leaf 6], leaf 6, leaf 44] i.e - all elements that follow a "Leaf 3" in the Tree
Mein Code schreiben müssen wie folgt (unter Verwendung von Muster passend)
foo n (Leaf _) = []
foo n (Node (Node z):y:xs) = if length (Node z):y:xs < 2 then []
else (foo n (Node z)):(foo n y:xs)
foo n (Node (Leaf z):y:xs) = if length (Leaf z):y:xs < 2 then []
else if Leaf n == Leaf z then [y]:(foo n y:xs)
else (foo n y:xs)
Allerdings bekomme ich einen Fehler:
• Couldn't match expected type ‘Tree a’ with actual type ‘[Tree a]’
• In the pattern: Node (Node z) : y : xs
Aber das Muster Node (Node z) : y : xs
den Eingang
Node [Node [Leaf 4, Leaf 2], Leaf 6, Leaf 9, Leaf 1]
Bin ich sagen, dass falsch darstellen könnte? Es scheint perfekt für mich.
Warum schlägt die Mustererkennung fehl?
'Knoten (Node z)' wird zuerst ausgewertet, da es Funktionsanwendung ist, aber es kann nicht beurteilen, weil der erste 'Knoten' erwartet einen' [Baum] ', aber er empfängt etwas, was ein' Baum' zu sein scheint. Probiere 'Knoten (Knoten z: y: xs)'. (In ähnlicher Weise symbolisieren '_: _: _' s in der Folge). – kuoytfouy
Ich kann mehrere Code-Gerüche über den falschen Klammern erkennen. Die Liste '(Leaf z): y: xs' hat sicherlich die Länge> = 2, also sieht das Testen falsch aus. Der Test 'Leaf n == Leaf z' ist seltsam, warum nicht' n == z'? Im Allgemeinen ist die Verwendung von "length" oft der falsche Weg: Der Musterabgleich gibt uns bereits Informationen über die Listenlänge. – chi