Wir wollen das "Haus vom Nikolaus" in einem Zug zeichnen: A / \ / \ / \ B------C |\ /| | \ / | | \/ | | /\ | | / \ | |/ \| D------E Wir definieren die Knoten und Kantentypen: > data Node = A | B | C | D | E > data Edge = Edge Node Node Nun koennen wir alle Kanten aufzaehlen: > allEdges = [Edge A B, Edge A C, Edge B C, Edge B D, Edge B E, > Edge C D, Edge C E, Edge D E] Zeichne alle Kanten nacheinander, indem jeweils eine passende Kante gewaehlt wird: > draw :: [Edge] -> [Node] -> Bool > draw edges (n1:n2:nodes) | chooseEdge n1 n2 edges == rest > = draw rest (n2:nodes) where rest free > draw [] [_] = True -- keine Kanten, nur ein Knoten: ok Waehle eine Kante und gebe die restlichen Kanten zurueck: entweder passt die erste, oder eine restliche: > chooseEdge :: Node -> Node -> [Edge] -> [Edge] > chooseEdge n1 n2 (Edge n1 n2 : edges) = edges > chooseEdge n1 n2 (Edge n2 n1 : edges) = edges > chooseEdge n1 n2 (edge : edges) = edge : chooseEdge n1 n2 edges Hierbei wurden nicht-lineare linke Regelseiten verwendet, die in Curry erlaubt sind (im Gegensatz zu Haskell). Dies ist eine Abkuerzung fuer folgende Definition: > chooseEdge' :: Node -> Node -> [Edge] -> [Edge] > chooseEdge' n1 n2 (Edge m n : edges) | m==n1 && n==n2 = edges > chooseEdge' n1 n2 (Edge m n : edges) | m==n2 && n==n1 = edges > chooseEdge' n1 n2 (edge : edges) = edge : chooseEdge' n1 n2 edges Loesung mittels Knotenliste als freie Variable: draw allEdges nodes where nodes free