Я начну с вашей попытки из комментариев, так как она очень близка:
fun subtree(x, Empty) = Empty
| subtree(x, T as Node(y, left, right)) =
if x = y
then T
else subtree(x, left) orelse subtree(x, right)
но есть проблема с типом, поскольку orelse
хочет два значения истинности, а не два дерева.
Вам нужно сделать что-то логически похожее, но с деревьями вместо фактов.
Один из способов увидеть путь вперед - переписать orelse
как эквивалентный анализ случая
fun subtree(x, Empty) = Empty
| subtree(x, T as Node(y, left, right)) =
if x = y
then T
else let val l = subtree(x, left) in
case l of
true => l
| false => subtree(x, right)
end
Здесь мы можем просто заменить логические случаи на древовидные:
fun subtree(x, Empty) = Empty
| subtree(x, T as Node(y, left, right)) =
if x = y
then T
else let val l = subtree(x, left) in
case l of
Node _ => l
| Empty => subtree(x, right)
end
или его можно немного переставить, чтобы сделать его короче
fun subtree(x, Empty) = Empty
| subtree(x, T as Node(y, left, right)) =
if x = y
then T
else case subtree(x, left) of
Empty => subtree(x, right)
| t => t
(Это довольно окольный способ найти решение, но именно так у меня проходил ход мыслей, когда я пытался переделать вашу функцию.)