плохо знаком с SML и пытаюсь учиться с помощью серии упражнений.Функция, которую я пытаюсь написать, имеет дело с выравниванием дерева с N детьми.Мой подход состоял в том, чтобы просто взять текущий NTreeNode
и добавить его значение в какой-то список, который я бы вернул.Затем возьмите второй аргумент - список детей и добавьте его в другой список, который будет моей очередью.Эта очередь будет служить всеми элементами, которые мне еще предстоит обработать.
Я попытался применить этот подход, передав NTreeList
и список, который я вернул бы с начальным значением в flattenNTree
, ввспомогательная функция.
Однако, когда я пытаюсь обработать NTreeNode
из своей очереди, он возвращает мне NTree
, и я не могу использовать свои функции first
/ second
для этого, янужен кортеж обратно из очереди.Я просто не понимаю, как вернуть кортеж, я пытался использовать конструктор NTreeNode
, но даже это возвращает мне NTree
.
Мой вопрос: как мне извлечь кортеж изNTree
тип данных, который я определил.
datatype NTree =
NTreeNode of int * NTree list
| EmptyNTree
;
fun first (a, _) = a;
fun second (_, b) = b;
fun processTree queue finalList =
if null queue
then finalList
else processTree ((tl queue)@(second(NTreeNode(hd queue)))) finalList@[first (NTreeNode (hd queue)) ]
;
fun flattenNTree EmptyNTree = []
| flattenNTree (NTreeNode x) = processTree (second x) [(first x)]
;
Пример входного значения:
val t =
NTreeNode (1, [
NTreeNode (2, [
NTreeNode (3, [EmptyNTree]),
NTreeNode (4, []),
NTreeNode (5, [EmptyNTree]),
EmptyNTree
]),
NTreeNode (6, [
NTreeNode (7, [EmptyNTree])
])
]);