data Tree a = Leaf | Node (Tree a) a (Tree a) deriving (Eq, Show)
unfoldTree:: (b -> Maybe (b, a, b)) -> b -> Tree a
unfoldTree f b =
case f b of
Nothing -> Leaf
Just (lt, x, rt) -> Node (unfoldTree f lt) x (unfoldTree f rt)
鉴于以上两条信息,我被要求实现一个树构建功能。
我的尝试是
treeBuild :: Integer -> Tree Integer
treeBuild 0 = Leaf
treeBuild n = treeUnfold (\b -> if b < 2^n-1
then Just(2*b, b + 1, 2*b + 1)
else Nothing)
0
基本情况适用于 n = 0 工作正常但我知道该功能完全错误的情况。有人可以向我重新解释一下如何3-tuple Just
工作吗?在正常展开中,a 中的第一个元素Just
将是我想要的元素,第二个元素将用于继续展开,但这在 3 元组 Just 中如何工作?
作为示例输出:
treeBuild 2 ----> Node (Node Leaf 0 Leaf) 1 (Node Leaf 2 Leaf)
编辑:我不完全确定 Just 在这里是如何工作的,对于Just(2*b, b + 1, 2*b + 1)
b 从 0 开始的情况,它会变成Just(0, 1, 0)
吗?我如何实际增加b?