Моя домашняя работа состоит в том, чтобы реализовать программу, которая берет функцию и двоичное дерево и выводит список целых чисел из двоичного дерева, которые выполняют функцию (пример: функция возвращает true, если число четное, поэтому вывод программы будетсписок четных целых чисел).
У меня есть код здесь:
datatype 'a tree = Empty | Node of ('a tree * int * 'a tree)
fun collect (p, Empty) = []
|collect (p, Node (L, x, R)) =
if (p x) then x :: (collect (p, L) @ collect (p, R))
else
collect (p, L) @ collect (p, R);
, который работает нормально, но назначение ТРЕБУЕТ, чтобы я реализовал эту функцию с исключениями.Мы должны использовать функции, несущие значения, но мой код просто не будет работать:
fun collect (p, Empty) = []
| collect (p, (Node(L, x, R))) =
if (p x) then (raise FoundSoFar [x])
else
(collect (p, L))@(collect (p, R))
handle FoundSoFar x => x @ (collect (p, L))@(collect (p, R))
, который правильно компилируется, но когда я пробую тестовый код, заданный учителем:
val L = Node (Node (Empty, 2, Empty), 5, Node (Empty, 6, Empty));
val R = Node (Empty, 12, Empty);
val T = Node (Node (L, 7, Node (Empty, 8, Empty)), 11, R);
val r = collect ((fn x => (x mod 2) = 0) , T);
Я только что получил ошибку необработанного исключения ... Мне либо нужна помощь, чтобы понять, что не так с моим кодом, как его исправить и \ или как правильно реализовать исключения, несущие значения, в SML, все поможет, спасибо.