2016-05-09 5 views
2

Я новичок в SML и делаю практику обхода дерева. Это настройка вопроса.Стандарт ML Двоичный траверс дерева

datatype 'a bTree = nil | bt of 'a bTree * 'a * 'a bTree; 

Мне нужно написать функцию, которая принимает Симметричные бинарное дерево и возвращает список всех членов дерева в заказовМой обхода.

Я написал эту строку:

fun inorder(nil) = nil 
    | inorder(bt(left,key,right)) = inorder(left) @ [key] @ inorder(right); 

Но получить некоторую ошибку и не знаю, как исправить:

Error: operator and operand don't agree [tycon mismatch] 
operator domain: 'Z list * 'Z list 
operand:   'Z list * 'Y bTree 
in expression: 
    (key :: nil) @ inorder right 

Error: operator and operand don't agree [tycon mismatch] 
operator domain: 'Z list * 'Z list 
operand:   'Y bTree * _ 
in expression: 
    inorder left @ (key :: nil) @ inorder right 

ответ

5

Вы нечаянно скрыли конструктор nil списка и заменить его вместе с Дерево конструктор с тем же именем.

Это означает, что ваш первый случай,

inorder(nil) = nil 

говорит, что результат inorder дерево; его тип

'a bTree -> 'a bTree 

и вы не можете добавить (@) список на 'a bTree.

Ваш код будет работать, если вы переименовать пустой конструктор дерева:

datatype 'a bTree = nilTree | bt of 'a bTree * 'a * 'a bTree; 

fun inorder nilTree = nil 
    | inorder (bt(left,key,right)) = inorder left @ [key] @ inorder right; 

или использовать [] вместо nil.
Не скрывать nil - лучшее решение.

+0

Спасибо человеку. Теперь я понимаю, что случилось с моим кодом сейчас! – WilsonHoHK

 Смежные вопросы

  • Нет связанных вопросов^_^