【问题标题】:How do you handle an exception for a function that returns an unknown type?如何处理返回未知类型的函数的异常?
【发布时间】:2018-03-08 01:55:12
【问题描述】:

假设我有以下类型和功能:

exception NotFound
type 'a mytype = (string * 'a) list
fun foo [] = raise NotFound
  | foo (x, b) :: bs = b

如果我要调用该函数并传入一个空列表,它将引发异常。通常该函数将返回 b,它的类型为 'a。我想处理异常但我不知道'a是什么类型,那我该怎么办?

相关,但我真的只想返回一个布尔值。我该怎么做?

显然,以下代码无法按预期工作,但它说明了我要完成的工作。

fun test mytypeobj = foo mytypeobj handle NotFound => false
    (* return true otherwise *)

【问题讨论】:

    标签: sml


    【解决方案1】:

    您的代码包含语法错误,因为左括号出现得太早了:

    exception NotFound
    type 'a mytype = (string * 'a) list
    fun foo [] = raise NotFound
      | foo (x, b :: bs) = b
    

    我想处理异常但我不知道'a是什么类型,我该怎么办?

    异常与'a无关,因此处理它是一个问题:

    val bar = foo [] handle NotFound => ...
    

    我真的只想返回一个布尔值。我该怎么做?

    fun test mytypeobj = foo mytypeobj handle NotFound => false (* otherwise true *)
    

    由于函数foo 没有任何实际用途,我不确定您要返回的什么布尔值。如果您不关心返回的布尔值是否是计算 foo ... 的结果,您可以执行以下操作来丢弃结果并返回您选择的布尔值:

    fun test bs = (foo bs; true) handle NotFound => false
    

    如果b::bs 是一个布尔值列表并且您想要返回其中的第一个,那么这就是您的函数所做的。当然,你不能确定它是true。当函数抛出正确的消息时,我刚才提到的模式对于单元测试很有用。例如,您可以测试空列表上的 hd 是否正确抛出 Empty:

    fun test_hd_empty = (hd []; false) handle Empty => true
                                            | _     => false
    

    这个测试说如果hd [] 没有抛出,它的结果被丢弃并且测试失败。如果它确实抛出,但异常不是Empty,它也应该失败。

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 2017-12-02
      相关资源
      最近更新 更多