Я поместил это как ответ, а не комментарий, так что есть некоторое форматирование:
data Rose a = Branch a [Rose a]
deriving (Show)
sample1 :: Rose Int
sample1 = Branch 1 [Branch 2 [], Branch 3 [Branch 5 []], Branch 4 []]
Это так же, как модуль библиотеки Data.Tree, хотя Data.Tree использует полевые лейбла и синоним типа.
Я видел это дерево и ваше первое определение под названием «Розовые деревья», хотя они имеют несколько иные формы, поэтому терминология не кажется полностью точной. Моя интерпретация заключается в том, что это список «[Роза]», встроенный в единственный рекурсивный конструктор, который определяет его как дерево розы.
Хорошо, но в обоих случаях Лист и Ветвь определяются языком, и я определяю собственное дерево типов. не так ли? –
@Stephane: Нет. В обоих случаях ни тип 'Tree', ни конструкторы' Leaf' и 'Branch' существовали ранее, и вы определяете все три из них своим определением' data'. – sepp2k
Привет sepp2k - «общее дерево», определенное в вопросе, обычно называется розовым деревом. Иногда они реализуются с помощью отдельного конструктора листьев, как указано выше - иногда в соответствии с данными. Трижды конструктор Branch несет данные вместо этого. –