OCaml Streams:异常处理还是选项类型?
OCaml Streams: exception handling or Option types?
为了处理 OCaml 中的异常情况,通常可以选择捕获异常或使用类型 'a option
。如果我理解正确,由于函数 Stream.next
(引发异常)和 Stream.peek
/Stream.junk
(return 'a option
),这两种选择对于 Streams 都是可能的。
和
有区别吗
match Stream.peek t with
| None -> ***
| Some c -> Stream.junk t; *****
和
try
let c = Stream.next t in *****
with Stream.Failure -> ***
其中 t
是类型 'a stream
的变量,而 ***
和 *****
是一些表达式序列?
编辑 2020-12-03
从OCaml 4.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 中的新功能)。
如您所见,行为没有差异。
具有选项类型的版本将使用更多数据,因为它必须为返回的每个值创建 Some x
。一般来说,这将是一个很小的影响,因为 OCaml 在垃圾收集短期值方面非常出色。
我个人喜欢使用选项,因为这两种情况之间存在并行性。但是使用 peek
和 junk
似乎比仅具有 returns 一个选项的功能要笨拙得多。所以对于这种情况,我可能会使用基于异常的处理。
换句话说,这是一个判断电话(在我看来)。
为了处理 OCaml 中的异常情况,通常可以选择捕获异常或使用类型 'a option
。如果我理解正确,由于函数 Stream.next
(引发异常)和 Stream.peek
/Stream.junk
(return 'a option
),这两种选择对于 Streams 都是可能的。
和
有区别吗match Stream.peek t with
| None -> ***
| Some c -> Stream.junk t; *****
和
try
let c = Stream.next t in *****
with Stream.Failure -> ***
其中 t
是类型 'a stream
的变量,而 ***
和 *****
是一些表达式序列?
编辑 2020-12-03
从OCaml 4.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 中的新功能)。
如您所见,行为没有差异。
具有选项类型的版本将使用更多数据,因为它必须为返回的每个值创建 Some x
。一般来说,这将是一个很小的影响,因为 OCaml 在垃圾收集短期值方面非常出色。
我个人喜欢使用选项,因为这两种情况之间存在并行性。但是使用 peek
和 junk
似乎比仅具有 returns 一个选项的功能要笨拙得多。所以对于这种情况,我可能会使用基于异常的处理。
换句话说,这是一个判断电话(在我看来)。