Exception OCaml流:异常处理还是选项类型?
要在OCaml中处理异常情况,通常可以选择捕获异常或使用typeException OCaml流:异常处理还是选项类型?,exception,stream,try-catch,ocaml,Exception,Stream,Try Catch,Ocaml,要在OCaml中处理异常情况,通常可以选择捕获异常或使用type'a选项。如果我理解正确,由于函数Stream.next(引发异常)和Stream.peek/Stream.junk(返回'a选项),这两个选项都可以用于流 两者之间有什么区别吗 match Stream.peek t with | None -> *** | Some c -> Stream.junk t; ***** 及 其中,t是类型为'a stream的变量,***和******是一些表达式序列吗 编辑2020
'a选项
。如果我理解正确,由于函数Stream.next
(引发异常)和Stream.peek
/Stream.junk
(返回'a选项
),这两个选项都可以用于流
两者之间有什么区别吗
match Stream.peek t with
| None -> ***
| Some c -> Stream.junk t; *****
及
其中,t
是类型为'a stream
的变量,***
和******
是一些表达式序列吗
编辑2020-12-03
由于OCAML4.02,也可以将上述内容写入
match Stream.next t with
| c -> *****
| exception Stream.Failure -> ***
如果要在c
上进行进一步的模式匹配,例如
match Stream.next t with
| [] -> *****
| a::b -> *******
| exception Stream.Failure -> ***
(来源:Xavier Leroy的幻灯片OCaml 4.02中的新增功能)。正如您所注意到的,行为上没有差异 带有选项类型的版本将增加一些数据,因为它必须为每个返回的值创建一些x。这通常只是一个小影响,因为OCaml在垃圾收集短期值方面非常出色 我个人喜欢使用选项,因为这两种情况之间是并行的。但是使用
peek
和junk
似乎比只使用返回选项的函数要麻烦得多。因此,对于这种情况,我可能会使用基于异常的处理
换言之,这是一个判断(在我看来)
match Stream.next t with
| [] -> *****
| a::b -> *******
| exception Stream.Failure -> ***