Я пытаюсь реализовать функцию удаления узла для двоичного дерева поиска в SML/nj. Однако я получаю ошибку ограничение, что я не понимаю, почему ...Получение выражения не соответствует ошибке
datatype 'a tree = Empty | Node of 'a * 'a tree * 'a tree;
datatype 'a stree = STree of ('a * 'a -> bool) * ('a * 'a -> bool) * 'a tree;
fun removeMin Empty = Empty
| removeMin (Node(_,Empty,r)) = r
| removeMin (Node(k,l,r)) = Node(k, removeMin l, r);
removeMin: 'a tree -> 'a tree;
fun get_left_most Empty = Empty
| get_left_most (Node(k,Empty,r)) = Node(k,Empty,r)
| get_left_most (Node(_,l,_)) = get_left_most l;
get_left_most: 'a tree -> 'a tree;
fun get_key (Node(k, l, r)) = k;
get_key: 'a tree -> 'a;
fun tree_empty Empty = true
| tree_empty (Node(_,_,_)) = false;
tree_empty: 'a tree -> bool;
fun remove v (STree(f, g, stree2)) =
let
fun remove2 v Empty = Empty
| remove2 v (Node(k,l,r)) =
if f(v, k) then
if (tree_empty l) then r
else if (tree_empty r) then l
else Node(get_key (get_left_most r), l, removeMin r)
else if g(v, k) then Node(k, (remove2 v l), r)
else Node(k, l, remove2 v r);
in
STree(f, g, (remove2 v stree2))
end;
remove: 'a -> 'a stree -> 'a stree;
Это ошибка, что я получаю: (для get_key
)
Warning: match nonexhaustive
Node (k,l,r) => ...
Кто-нибудь знает, почему это происходит?
Они называются [переменные типа равенства] (http://www.mlton.org/EqualityTypeVariable). Более подробную информацию о полиморфном равенстве в SML можно увидеть здесь (http://www.mlton.org/PolymorphicEquality) –
@ Jesper.Reenberg Спасибо. Удивительно то, что вы забыли в 15 лет ... Я обновил и надеюсь, что это разумно правильно. – molbdnilo
Что это значит: (node @ Node (k, Empty, Empty)) – omega