我基本上提出了与此处提出的问题相同的问题:Haskell label a binary tree through depht-first in-order traversel但答案从未实际给出过,由于缺乏声誉,我无法在那里发表评论。
现在我有一个功能label
:
label :: MonadState m Int => Tree a -> m (Tree (Int, a))
label Leaf = return Leaf
label (Branch leftTree a rightTree) = do n <- get
modify (+1)
l' <- label leftTree
r' <- label rightTree
return (Branch l' (n,a) r')
其中Tree a = Leaf | Branch (Tree a) a (Tree a)
。
现在,这会将树标记为广度优先。现在我想首先标记leftTree
,然后标记Branch
本身,然后标记rightTree
,但我不知道如何实现这一点而另一个线程没有标记{&#39}。进一步帮助我。
答案 0 :(得分:1)
我刚刚回答了较早的问题here。很抱歉错误地归咎于你。关键在于,当您编写类型时,您还告诉Haskell如何以确保traverse
发生在中间的方式get
您的数据结构。
您自己本地编写错误的程序是一个您已经正确编写的程序,只需定义您的类型,如果您只知道。