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 ?

19
demandé sur Stephane Rolland 2010-12-13 20:50:27

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.

52
répondu Tyler Eaves 2014-05-02 20:52:49

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.

8
répondu sepp2k 2010-12-13 17:53:50

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.

6
répondu stephen tetley 2010-12-13 21:41:54