Всем привет!
Делаю задания
к лекциям с сайта nemerle.org.
Не могу избавиться от ворнинга компилера. Пишу is — предлагает двоеточие. Ставлю двоеточие — предлагает is.
Выделил жирным в коде (метод Remove, вложенный match).
ЗЫ. Приветствуются любые замечания по коду. Что можно улучшить?
variant Tree['T]
where 'T : IComparable['T]
{
| Node
{
left: Tree['T];
value: 'T;
right: Tree['T];
}
| Null;
public Add(value: 'T) : Tree['T]
{
match (this)
{
| Node(left, node, right) when (value.CompareTo(node) < 0) => Node(left.Add(value), node, right);
| Node(left, node, right) when (value.CompareTo(node) > 0) => Node(left, node, right.Add(value));
| Node => this;
| Null => Node(Null(), value, Null());
}
}
public Remove(value: 'T): Tree['T]
{
match (this)
{
| Node(left, node, right) when (value.CompareTo(node) < 0) => Node(left.Remove(value), node, right);
| Node(left, node, right) when (value.CompareTo(node) > 0) => Node(left, node, right.Remove(value));
| Node(left, _, right) =>
match(left, right)
{
| (Null, right) => right;
| (left, Null) => left;
| (left, right) =>
def LeftestLeaf(tree: Node) : Node
{
match (tree)
{
| Node(Null, _, _) => tree;
| Node(left is Node, _, _) => LeftestLeaf(left); // Пишу is - предлагает двоеточие. Ставлю двоеточие - предлагает is.
| _ => throw ArgumentException("Node expected");
}
}
def leftestLeaf = LeftestLeaf(right :> Tree['T].Node);
Node(left, leftestLeaf.value, right.Remove(leftestLeaf.value));
}
| Null => this;
}
}
public override ToString() : string
{
match (this)
{
| Node(left, node, right) => $"($left $node $right)";
| Null => ".";
}
}
}