Я пытаюсь создать дерево из списка.
Я написал функцию, используя foldl и foldr (последний не показан)
treeFromList l
| null l = error "no elements in list"
| otherwise = foldl insertIfAbsent (initTree (head l)) (tail l)
где Tree DS определяется в отдельном модуле как
data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving Show
initTree x = (Node x EmptyTree EmptyTree)
и treeFold
записывается вручную (не выводится) как
foldTree f acc t
| (empty t) = acc
| otherwise = foldTree f outerVal (leftSub t)
where
outerVal = f (value t) rightVal
rightVal = foldTree f acc (rightSub t)
Подумав об этом, я считаю, что это невозможно сделать из-за конфликта типов. Теоретически, дерево должно быть построено в аккумуляторе, в то время как список постоянно сокращается / сворачивается.
Напротив, мне удалось преобразовать в foldl
версию в foldr
, и, очевидно, foldr
можно выразить с помощью foldTree
.
Есть предложения? Спасибо!