split s (Root x lst rst)
| s < x = let (nlt, nrt) = split s lst in
(nlt, Root x nrt rst)
有人可以解释一下这行吗?我并没有真正得到let
部分。
我试着考虑一下,我不知道我是否做对了:
我们将(nlt, nrt)
绑定到split s lst
的结果; split s lst
本身将是(nlt, Root x nrt rst)
这是完整的代码:
split :: Ord a => a -> Tree a -> (Tree a, Tree a)
split _ Empty = (Empty, Empty)
split s (Root x lst rst)
| s < x = let (nlt, nrt) = split s lst in
(nlt, Root x nrt rst)
| s > x = let (nlt, nrt) = split s rst in
(Root x lst nlt, nrt)
答案 0 :(得分:44)
我们将
的结果(nlt, nrt)
绑定到split s lst
是的 - split s lst
是一对,我们将名称nlt
和nrt
分配给该对的两个元素。
和
split s lst
本身将是(nlt, Root x nrt rst)
不,split s (Root x lst rst)
(整个功能的结果)将为(nlt, Root x nrt rst)
。
split :: Ord a => a -> Tree a -> (Tree a, Tree a)
split _ Empty = (Empty, Empty)
split s (Root x lst rst)
| s < x = let (nlt, nrt) = split s lst in
(nlt, Root x nrt rst)
| s > x = let (nlt, nrt) = split s rst in
(Root x lst nlt, nrt)
让我们试试一些样本数据:
> split 300 (Root 512 (Root 256 (Root 128 Empty Empty) (Root 384 Empty Empty)) Empty)
(Root 256 (Root 128 Empty Empty) Empty,Root 512 (Root 384 Empty Empty) Empty)
因此我们选择了一个以512为根的树,以及比左子树中的所有项小的树,并将其拆分,以便第一个树由300以下的条目组成,第二个树在第二个树中组成300以上。看起来像这样:
首先让我们用扩展名重写代码:
split :: Ord a => a -> Tree a -> (Tree a, Tree a)
split _ Empty = (Empty, Empty)
split s (Root x left_subtree right_subtree)
| s < x = let (new_left_tree, new_right_tree) = split s left_subtree in
(new_left_tree, Root x new_right_tree right_subtree)
| s > x = let (new_left_tree, new_right_tree) = split s right_subtree in
(Root x left_subtree new_left_tree, new_right_tree)
警卫|s < x
表示我们认为此x
应该在右侧。
首先,我们拆分左子树split s left_subtree
,给我们一个new_left_tree
和new_right_tree
。 new_left_tree
是应该留下的内容,但new_right_tree
与x
和原始right_subtree
合并,以构成{{1}右侧的位1}}。
由于s
位于right_subtree
的左侧,s
属于x
,因此该函数假设树已经在Root x l r
的意义上排序了,l
中的所有内容均低于x
,r
中的所有内容均高于x
。
left_subtree
被拆分,因为其中一些可能小于s
而其他位超过s
。
现在属于右侧的split s left_subtree
部分(因为它超过s
)称为new_right_tree
,因为整个left_subtree
小于{{ 1}}和x
,所有right_subtree
仍应位于new_right_tree
和x
的左侧。这就是为什么我们让right_subtree
成为对中的右手答案(以及对中左侧的Root x new_right_tree right_subtree
)。
这是一张前后图:
好问题。我们这样做:
new_left_tree
好吧,我认为这回答了我的问题:有时描述性的名字也会让人感到困惑!