我正在Haskell中做一个小项目,我很难创建一个"玫瑰树";。我的玫瑰树有一个不同的点,从一开始我可以有四种可能性。
我想做的是:
data RoseTree a = Start [RoseTree Movimento] | Node a [RoseTree Movimento]
deriving (Eq, Show)
paths :: RoseTree Movimento -> [[Movimento]]
paths (Start []) = []
paths (Node n []) = [[n]]
paths (Node n ns) = map ((:) n . concat . paths) ns
paths (Start xs) = undefined
PS->树示例:
data Movimento = AndarEsquerda | AndarDireita | Trepar | InterageCaixa
deriving (Show, Read, Eq, Ord)
Start [Node AndarEsquerda [Node AndarDireita [Node AndarEsquerda [],Node Trepar []]],Node Trepar [Node AndarDireita [Node AndarDireita []],Node AndarEsquerda [Node AndarEsquerda []]]]
预期输出:
[[AndarEsquerda, AndarDireita, AndarEsquerda],
[AndarEsquerda, AndarDireita, Trepar],
[Trepar, AndarDireita, AndarDireita],
[Trepar, AndarEsquerda, AndarEsquerda]]
树示例
在您的代码中是表达式paths (Start xs)
的未定义右侧。如果我使用表达式(paths n) ++ (paths (Start ns))
定义,它不会返回所需的输出。
琐碎的情况[]是可以的,但您不需要使用(n:ns)
递归来遍历列表以使琐碎的情况发生。您可以使用map函数进行迭代,这是递归的一种替代方法。
我使用map
函数滚动到树的宽度,使用递归浏览到树的深度。
paths2 :: RoseTree Movimento -> [[Movimento]]
paths2 (Start []) = []
paths2 (Node m []) = [[m]]
paths2 (Node m (n:ns)) = map ((++) [m]) ((paths2 n) ++ (paths2 (Start ns)))
paths2 (Start (n:ns)) = (paths2 n) ++ (paths2 (Start ns))
输出:
[[AndarEsquerda,AndarDireita,AndarEsquerda],
[AndarEsquerda,AndarDireita,Trepar],
[Trepar,AndarDireita,AndarDireita],
[Trepar,AndarEsquerda,AndarEsquerda]]
编辑:您可能喜欢使用Start
中的(n:ns)
。
paths2 :: RoseTree Movimento -> [[Movimento]]
paths2 (Start []) = []
paths2 (Node m []) = [[m]]
paths2 (Node m ns) = map ((:) m) $ paths2 (Start ns)
paths2 (Start (n:ns)) = paths2 n ++ paths2 (Start ns)