【发布时间】:2016-01-27 12:19:51
【问题描述】:
data Node = Node Char [Node] deriving(Eq)
nodeA = Node 'A' [nodeB, nodeC, nodeD]
nodeB = Node 'B' []
nodeC = Node 'C' [nodeE, nodeF]
nodeD = Node 'D' []
nodeE = Node 'E' [nodeB]
nodeF = Node 'F' [nodeA]
deepTraverse :: Node -> [Char]
deepTraverse (Node c []) = [c]
deepTraverse (Node c ns) = c:(map (\(Node cl nsl)->cl) (buildNodeList (Node c ns) ns))
where lssToLs lss = foldr (++) [] lss
buildNodeList nw nsw = lssToLs (map (\(Node cl nsl)->(if (Node cl nsl) == nw then [(Node cl nsl)]
else ((Node cl nsl):(buildNodeList nw nsl)))) nsw)
main :: IO()
main = putStrLn (show (deepTraverse nodeA))
每当我打电话给deepTraverse nodeA 时,它都会挂断。在 ghci 中它确实吐出:
Main*> "ABCEBF
让我怀疑 if 的“then”部分。一段时间以来,我一直在努力解决这个问题,任何帮助将不胜感激。
【问题讨论】:
-
提示:
lssToLs与标准concat函数相同。此外,还有一个名为concatMap的函数。这些都与您的错误无关;这只是一个路过的评论。 -
谢谢,我在我的 cmets 中用 concat 给出的答案测试了我的 cmets 中提到的固定版本,它确实工作相同。忘了检查那个的前奏功能。
标签: haskell infinite-loop ghci