说我有以下类型和功能:
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 *)
答案 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
,它也应该失败。