Я новичок в Haskell, и для практики я выполнял кучу функций (map
, length
и т. Д.) С использованием foldr
и foldl
. Теперь я хочу двигаться на деревья!Картирование по дереву
Моя древовидная структура данных:
data Tree a = Node a [Tree a] deriving (Show)
Я написал функцию Haskell сложить над деревьями:
treeFold :: (b->a->b) -> b -> Tree a -> b
treeFold f s (Node a []) = f s a
treeFold f s (Node a xs) = foldl f (f s a) (dFSList xs)
где dFSList
находится список всех узлов в дереве. Так что делайте что-то вроде:
treeFold (+) 0 (Node 1 [Node 2 [], Node 3 []])
возвращается 6. Прохладный.
Теперь я хочу написать функцию Haskell для отображения над деревьями, но я хочу использовать свою функцию treeFold
для ее выполнения. Вот то, что я до сих пор:
treeMap f (Node a []) = (Node (f a) [])
treeMap f (Node a (x:xs)) = (Node (f a) (a list involving foldTree somehow??))
Как закончить свою treeMap
функцию? Я хочу быть в состоянии сделать
treeMap (+1) (Node 1 [Node 2 [], Node 3 []])
и он должен вернуть
(Node 2 [Node 3 [], Node 4 []])
пути вы преобразование дерева в виде плоский список (возможно, с произвольным порядком WRT формы дерево), а затем выполнение обычного сложения над ним означает, что сгибание не зависит от дерева, т. е. ваша функция сгибания не может принимать во внимание форму дерева и только видит содержимое в произвольном порядке. –