Arbres à Haskell
j'apprends encore haskell, et je ne vois pas vraiment la différence entre
data Tree a = Leaf a | Branch [Tree a]
et
data Tree a = Leaf a | Branch (Tree a) (Tree a)
<!-Qu'est-ce qui est le mieux selon vous? Quelle est l'implication de ces deux façons de l'écrire ?
3 réponses
la branche du premier contient une liste D'arbres, donc potentiellement n'importe quel nombre de sous-arbres. Le 2ème est explicitement deux sous-arbres, donc un arbre binaire.
le premier définit un arbre où chaque branche peut avoir arbitrairement plusieurs sous-arbres (représentés sous forme de liste d'arbres) et le second définit un arbre où chaque branche a exactement deux sous-arbres.
en d'autres termes, le premier est un arbre général et le second est un arbre binaire.
Donc lequel choisir dépend si vous voulez un modèle général d'arbre ou un arbre binaire.
j'ai mis ceci comme réponse plutôt que commentaire donc il y a un formatage:
data Rose a = Branch a [Rose a]
deriving (Show)
sample1 :: Rose Int
sample1 = Branch 1 [Branch 2 [], Branch 3 [Branch 5 []], Branch 4 []]
c'est la même chose que les données du module de bibliothèque.Arbre, bien que les Données.Tree utilise des étiquettes de terrain et un synonyme de type.
j'ai vu à la fois cet arbre et votre première définition appelée "rosiers" bien qu'ils aient des formes légèrement différentes de sorte que la terminologie ne semble pas être tout à fait précise. Mon interprétation est que c'est la liste "[Rose a]" intégrée dans le simple récursif constructeur qui le définit comme un rosier.