如何处理返回未知类型的函数的异常?

时间:2018-03-08 01:55:12

标签: sml

说我有以下类型和功能:

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

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

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

显然,以下代码不能按预期工作,但它说明了我要完成的任务。

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

1 个答案:

答案 0 :(得分:0)

您的代码包含语法错误,因为左括号有点太快了:

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,它也应该失败。