repmin
问题是众所周知的。我们得到了树的数据类型:
data Tree a = Leaf a | Fork (Tree a) a (Tree a) deriving Show
我们需要编写一个函数 down( ) ,它将获取一棵数字树,并在一次传递repmin
中将其中的所有数字替换为它们的最小值。也可以沿途打印树(假设函数执行此操作)。使用值递归可以很容易地写下前序、后序和有序。以下是 in-order 的示例:repminPrint
repmin
repminPrint
repminPrint
import Control.Arrow
replaceWithM :: (Tree Int, Int) -> IO (Tree Int, Int)
replaceWithM (Leaf a, m) = print a >> return (Leaf m, a)
replaceWithM (Fork l mb r, m) = do
(l', ml) <- replaceWithM (l, m)
print mb
(r', mr) <- replaceWithM (r, m)
return (Fork l' m r', ml `min` mr `min` mb)
repminPrint = loop (Kleisli replaceWithM)
但是如果我们想写下level-orderrepminPrint
怎么办?
我的猜测是我们不能使用队列,因为我们需要ml
和mr
更新绑定m
。我看不出这怎么会因队列而下降。我写了一个 level-order 的实例Foldable Tree
来说明我的意思:
instance Foldable Tree where
foldr f ini t = helper f ini [t] where
helper f ini [] = ini
helper f ini ((Leaf v) : q = v `f` helper f ini q
helper f ini ((Fork l v r) : q) = v `f` (helper f ini (q ++ [l, r]))
如您所见,我们在当前递归调用期间l
和期间不运行任何东西。r
那么,这怎么可能呢?我希望得到提示而不是完整的解决方案。