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)
上記の2つの情報を踏まえて、ツリー構築関数を実装するように求められます。
そして私の試みは
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
の要素は必要な要素であり、2番目の要素は展開を続行するために使用されますが、これは3タプルでどのように機能しますか?
出力例として:
treeBuild 2 ----> Node (Node Leaf 0 Leaf) 1 (Node Leaf 2 Leaf)
Just(2*b, b + 1, 2*b + 1)
編集: bが0から始まる場合、ここでJustがどのように機能するかは完全にはわかりませんが、次のようになりJust(0, 1, 0)
ますか?実際にbをインクリメントするにはどうすればよいですか?