【发布时间】:2012-02-21 20:12:27
【问题描述】:
我的作业是实现一个程序,该程序接受一个函数和二叉树,并从二叉树中输出满足该函数的整数列表(例如:如果数字为偶数,则该函数返回 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 中正确实现带有值的异常,任何事情都会有所帮助,谢谢。
【问题讨论】:
-
你遇到了哪个异常?你的 FoundSoFar 不是一个具有价值的例外吗?
-
它编译,它只是不工作。它实际上是说 uncaught foundsofar 异常。
-
考虑一下你在做什么:你在左子树和右子树中寻找满足
p的元素。如果你找到一个,就会抛出一个异常,你会捕获它,然后你再次执行相同的搜索。所以,你自然会再次抛出同样的异常。 -
那我不明白你的问题。您得到的异常已经具有价值。也许您真正的问题是如何获得调试价值?好吧,你可以在定义 'r' 的表达式(这是抛出的那个)周围包裹一个 'handle' 并对其进行模式匹配。
-
可以,但是为了调试目的临时更改代码并没有错。