哈斯克尔-玫瑰树小径



我正在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)

相关内容

  • 没有找到相关文章

最新更新