Я пытаюсь суммировать ВСЕ пути, хотя дерево, которое расширяет каждый уровень от 1 до 10 раз от корня до младших. Моя функция рекурсивно относится ко всем дочерним элементам, но у меня есть проблема, когда я пытаюсь создать список узлов и делать эти списки в списке, я становлюсь списком списка списка ... списка. Я думаю, что моя проблема - это комбинационный шаг. И я попытался создать метод сопоставления шаблонов, но метод, который должен сравнивать списки, когда он становится списком списков, и должен создавать новые списки и сравнивать их, если он получается только одним способом (соответствует список с узлами, а не список со списками) не работает.Haskell суммирует все пути по дереву
ответ
summarize :: Tree a -> [[a]]
summarize Leaf = [[]]
summarize (Node a t1 t2) = do
t <- [t1, t2]
map (a:) (summarize t)
Edit: Обратите внимание, что выше, предполагает следующее определение Tree
:
data Tree a = Leaf | Node a (Tree a) (Tree a)
Edit # 2: Эта версия кода может быть яснее:
summarize :: Tree a -> [[a]]
summarize Leaf = [[]]
summarize (Node a t1 t2) = do
t <- [t1, t2]
summary <- summarize t
return (a:summary)
Эта версия имеет хорошая характеристика, которую можно записать в виде списка:
summarize (Node a t1 t2) = [a:summary | t <- [t1, t2], summary <- summarize t]
I * like * этот ответ. –
@rightfold Это не эквивалентно. Ваша версия завершает окончательный результат в 'return'. –
@GabrielGonzalez Упс, мозг. В следующий раз следует обратить больше внимания. :) –
Дерево можно представить в виде списка-монадического списка (список, в котором есть несколько вариантов того, как он возобновляется в каждой точке). Тогда вы хотите просто сложить этот монадический список.
import Control.Monad.Trans.List.Funcs (repeatM) -- cabal install List
import qualified Data.List.Class as L
exampleTree = L.take 3 (repeatM [0, 1])
Чтобы увидеть все пути:
ghci> L.toList exampleTree
[[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
Суммируя все пути:
ghci> L.foldlL (+) 0 exampleTree
[0,1,1,2,1,2,2,3]
WRT это представление деревьев, то ListTree пакет предлагает комбинаторы для операций дерева (например, DFS/BFS) на деревьях, представленных как ListT []
s.
- 1. Haskell Tree - поиск по дереву
- 2. Поиск дешевого пути по двоичному дереву?
- 3. Картирование по дереву
- 4. Как перечислить все пути по графу с помощью Haskell
- 5. Агрегатор Camel не суммирует все
- 6. Прогулка по дереву принтера
- 7. прогулка по дереву функционально
- 8. BeautifulSoup навигации по дереву
- 9. Путешествие по дереву
- 10. Получить данные по дереву
- 11. Сложность прогулки по дереву слоя
- 12. Прогулка по дереву, родительский первый
- 13. ActiveModel пройти вверх по дереву
- 14. Сортировка по дереву: временная сложность
- 15. Навигация по базовому двоичному дереву
- 16. Навигация по дереву NLTK (последующий)
- 17. Выбор цвета по дереву цветов
- 18. нужен редукционный совет по дереву
- 19. Как пройти по дереву AST
- 20. Wxpython: TreeCtrl: Итерация по дереву
- 21. Прохождение вниз по дереву DOM
- 22. TreeViewItem.HeaderTemplate и перемещение по дереву
- 23. Возврат результатов поиска по дереву
- 24. обхода по дереву в схеме
- 25. Выбирайте элементы-братья по дереву
- 26. Web.config трансформирует добавить дереву
- 27. Прохождение реакции компонента вверх по дереву
- 28. Эффективный поиск по дереву ForeignKeys в Django
- 29. Sass шаблон для перемещения вверх по дереву
- 30. Как просмотреть файлы и папки из пути к дереву?
Ваш (нерабочий) код, вероятно, сделает то, что вы пробовали намного яснее :-) – gspr