Этот тип
data MyTree
= MyTreeInt
| MyTreeString
совершенно не относится к типам MyTreeInt
и MyTreeString
. Выше эти имена используются как имена конструкторов данных, а не как имена типов, поэтому они не ссылаются на другие типы деревьев. Вместо этого вы можете захотеть что-то вроде
data MyTree
= MyTreeInt MyTreeInt
| MyTreeString MyTreeString
где после имени конструктора мы также включаем тип дерева.
Тогда мы можем написать
toString2 :: MyTree -> String
toString2 (MyTreeInt (MyTreeIntAtom i)) = "A"
toString2 (MyTreeInt (MyTreeIntPlus t1 t2)) = "B"
toString2 (MyTreeString (MyTreeStringAtom i)) = "C"
toString2 (MyTreeString (MyTreeStringConcat t1 t2)) = "D"
Мы также можем повторно использовать вспомогательные функции, например,
toString2 :: MyTree -> String
toString2 (MyTreeInt t) = treeIntToString t -- this is toString1
toString2 (MyTreeString t) = treeStringToString t -- this has to be defined