按照Okasaki的例子,我试图在Rust中实现一个纯功能的红黑树。当我插入一棵红黑树时,我可能不得不插入树中。这是balance
函数的Haskell代码:
balance :: Ord a => Color -> Tree a -> a -> Tree a -> Tree a
balance Black (T Red (T Red a x b) y c) z d = T Red (T Black a x b) y (T Black c z d)
balance Black (T Red a x (T Red b y c)) z d = T Red (T Black a x b) y (T Black c z d)
balance Black a x (T Red (T Red b y c) z d) = T Red (T Black a x b) y (T Black c z d)
balance Black a x (T Red b y (T Red c z d)) = T Red (T Black a x b) y (T Black c z d)
balance c l v r = T c l v r
此代码使用嵌套匹配。但是,这在Rust中是不可能的,因为必须使用"盒装"左右分支的表示。我正在使用Rc
。这是Tree<A>
的数据定义:
#[derive(Clone, Debug, Eq, PartialEq)]
enum Tree<A> {
E,
T(Color, Rc<Tree<A>>, A, Rc<Tree<A>>)
}
如何实现等效的#34;嵌套匹配&#34;当我有Rc
s?
我很清楚无法匹配Rc
s 。相反,我想知道是否有相同的编程习语可以达到同样的效果。