Учитывая дерево в Haskell (представленное Data.Tree
), как я могу найти путь к узлу?Как найти путь к узлу в Haskell Data.Tree
например.
import Data.Tree
tree = Node 1 [Node 2 [Node 3 []], Node 4 []]
Который образует дерево, которое выглядит как:
1
|
+- 2
| |
| `- 3
|
`- 4
Как я мог бы сделать функцию pathToNode
таким образом, что:
pathToNode 0 tree => []
pathToNode 1 tree => [1]
pathToNode 2 tree => [1, 2]
pathToNode 3 tree => [1, 2, 3]
pathToNode 4 tree => [1, 4]
В моем конкретном случае любое данное значение будет отображаться только один раз в дереве, поэтому допустимо решение, возвращающее путь a к значению.
До сих пор мой лучший ответ:
pathToNode :: (Eq a) => a -> Tree a -> [a]
pathToNode x (Node y ys) | x == y = [x]
| otherwise = case concatMap (pathToNode x) ys of
[] -> []
path -> y:path
Есть ли более лаконичный способ написания этого? Можно ли использовать Data.Foldable
или Data.Traversable
, чтобы избежать написания моей собственной логики перемещения?
Ответ Андраша Ковача дал мне понять, что вопрос неоднозначен в отношении того, что я хочу, когда значение появляется более одного раза в дереве. Исправлено. – jml