2017-08-14 2 views
1

Salut tout ceci est ma première question ici, je suis très nouveau à Haskell et j'ai besoin de faire une fonction Haskell qui prend un arbre et retourne une liste des éléments dans son nœud dans une traversée de précommande mais Je n'arrive pas à le faire marcher.Traversée d'arbres avec Haskell

Ma définition d'arbres est la suivante:

data Tree a = Node a [Tree a] deriving Show 

et la fonction de pré-commande est:

preorderTree :: Tree a -> [a] 
preorderTree Empty = [] 
preorderTree (Node a l r) = a : (preorderTree l) ++ (preorderTree r) 

En avance je vous remercie beaucoup pour votre aide :)

+5

Eh bien, vous avez écrit 'Node' pour ne prendre que deux arguments, mais en correspondance motif sur trois. –

+0

Vous avez la définition de données d'un arbre de roses mais une fonction qui semble attendre un arbre binaire. Si vous voulez que 'preorderTree' fonctionne pour votre type de données' Tree', jetez un œil à 'concatMap'. – Alec

+2

Ce n'est pas votre première question puisque vous n'avez rien demandé. Vous n'avez également publié aucun message d'erreur. Étant donné que la traversée et la déclaration de données ne correspondent pas, il existe deux correctifs possibles. Le correctif correct n'est pas clair, j'ai donc voté pour fermer. N'hésitez pas à modifier la question. –

Répondre

2

Dans Haskell, type est un ensemble de valeur s. Nous avons donc à la fois un constructeur de type et un constructeur de valeur. Donc, écrire une fonction de haskell. Nous avons besoin de définir correctement le type (Tree). Traiter chaque valeur (Empty, Node ...) dans le correspondant de type.

Tree a est un type. Sa valeur est soit Empty ou un groupe d'enfants. Ainsi, nous avons

data Tree a = Empty 
      | Node a [Tree a] 

Donc, quand nous écrivons une fonction comme preorderTree :: Tree a -> [a]. Nous traitons typeTree a, donc nous devons traiter avec la valeur Empty et Node a [Tree a]. Nous avons donc

preorderTree :: Tree a -> [a] 
preorderTree Empty = [] 
preorderTree (Node a children) = a : concatMap preorderTree children 

Ceci est un arbre de rose, si vous voulez juste un arbre binaire, il faut changer le constructeur de valeur de type Tree a, parce que [Tree a] est juste trop pour un arbre binaire. Nous avons donc

data Tree a = Empty 
      | Node a (Tree a) (Tree a) 

preorderTree :: Tree a -> [a] 
preorderTree Empty = [] 
preorderTree (Node a left right) = a : preorderTree left ++ preorderTree right 

  1. https://wiki.haskell.org/Constructor
+0

Merci beaucoup pour votre aide, cela m'aide vraiment et aussi je commence vraiment à aimer Haskell :) – Deindery