【问题标题】:Value-Carrying Exceptions in SMLSML 中的价值承载异常
【发布时间】: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' 并对其进行模式匹配。
  • 可以,但是为了调试目的临时更改代码并没有错。

标签: exception tree sml


【解决方案1】:

这部分代码没有意义:

        (collect (p, L))@(collect (p, R))
handle FoundSoFar x => x @ (collect (p, L))@(collect (p, R))

如果handle 部分运行,则意味着(collect (p, L))@(collect (p, R)) 抛出了异常。但是当你处理它时你会怎么做?您评估完全相同的表达式再次(作为句柄表达式右侧的一部分)。所以很自然,这个评估会失败并再次抛出完全相同的异常,有点像这样:

(collect (p, L))@(collect (p, R)) handle FoundSoFar x => raise FoundSoFar x

所以到最后,就好像你一开始就没有捕获到异常:

(collect (p, L))@(collect (p, R))

您可能想要捕获异常,然后对捕获的值执行一些有用的操作,但运行导致异常开始的完全相同的表达式。

附:您要考虑的代码中另一个不相关的问题是优先级。 handle 的优先级高于 if-then-else

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2017-08-28
    • 2015-02-03
    相关资源
    最近更新 更多