我正在尝试从Algorithms 4th Edition
实施以下代码private Node put(Node x, Key key, Value val)
{
if (x == null) return new Node(key, val, 1);
int cmp = key.compareTo(x.key);
if (cmp < 0) x.left = put(x.left, key, val);
else if (cmp > 0) x.right = put(x.right, key, val);
else x.val = val;
x.N = size(x.left) + size(x.right) + 1;
return x;
}
我在F#中提出了以下实现:
type Node = {
mutable Left : Node option
mutable Right : Node option
mutable Value : int
mutable Count : int
}
type BST() =
let root : Node option = None
member x.Put (value : int) =
let rec Add (node:Node option) value =
match node with
| None -> Some { Left = None; Right = None; Value = value; Count = 1 }
| Some t ->
match t with
| _ when t.Value < value -> t.Right <- Add t.Right value
| _ when t.Value > value -> t.Left <- Add t.Left value
| _ ->
t.Value <- value
t.Count <- (x.Size t.Left) + (x.Size t.Right) + 1
Some t
()
我收到错误:预计会有类型的Node选项,但在这里作为单位,在以下行中:
| _ when t.Value < value -> t.Right <- Add t.Right value
| _ when t.Value > value -> t.Left <- Add t.Left value
有没有更好的方法来实现上述代码?我是否通过复制程序样式代码而在功能方法中犯了错误?
答案 0 :(得分:3)
您收到错误是因为bind
匹配返回None
,因此您拥有以匹配所有其他分支中的返回类型。
您可以通过在匹配后返回节点来解决其他匹配中的问题:
Some Node
(您可能会注意到我注释掉倒数第二行,因为let rec Add (node:Node option) value =
match node with
| None -> Some { Left = None; Right = None; Value = value; Count = 1 }
| Some t ->
match t with
| _ when t.Value < value ->
t.Right <- Add t.Right value
Some t
| _ when t.Value > value ->
t.Left <- Add t.Left value
Some t
| _ ->
t.Value <- value
//t.Count <- (x.Size t.Left) + (x.Size t.Right) + 1
Some t
没有x
成员。)
我是否因为在功能方法中复制程序样式代码而犯了错误?
可能。这取决于你的目标是什么。如果你想学习F#的语法,这可能是一个很好的练习。如果你想学习功能编程,那么这样做是没有意义的。