首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无限环Haskell

无限环Haskell
EN

Stack Overflow用户
提问于 2015-10-27 21:40:15
回答 1查看 374关注 0票数 2
代码语言:javascript
复制
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,它确实吐出了:

代码语言:javascript
复制
Main*> "ABCEBF

让我怀疑“那么”的一部分。我对这个问题已经有一段时间了,任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-27 21:54:14

在盯着你的代码看了很久之后,我想我意识到了这个问题。

nodeF指向nodeA。(我才意识到这一点!)似乎您正在尝试使用==操作符来确定当您返回到您已经查看过的节点时。那不管用。

当您说node1 == node2时,==运算符将遍历整个树,以查看这两个值是否相等。如果它们相等,并且这个结构包含一个无限循环..。那么你的代码就会永远循环!试试看。如果你问nodeA == nodeA,我想你会发现它永远不会回来。这是你的虫子。

解决这个问题的唯一方法是在每个Node上放置一个真正独特的标签,并且只比较这些标签。您不能在Haskell中检查两个变量是否“指向”相同的东西;您只能比较两个结构是否具有相同的值,这意味着完全遍历它们。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33378977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档