Уточнить тип в match-е
От: MatFiz Россия  
Дата: 01.05.07 13:33
Оценка:
Всем привет!
Делаю задания к лекциям с сайта 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 => ".";
            }
        }
    }
How are YOU doin'?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.