在OCaml中还有其他解构选项类型的方法吗?
OCaml的选项类型在函数可能不返回任何内容的情况下非常有用。但是当我在很多地方使用它时,我发现在在OCaml中还有其他解构选项类型的方法吗?,ocaml,ml,code-readability,Ocaml,Ml,Code Readability,OCaml的选项类型在函数可能不返回任何内容的情况下非常有用。但是当我在很多地方使用它时,我发现在匹配中始终处理Some案例和None案例很麻烦。。。使用 比如说,, 是否有其他方法以简洁的方式解构选项类型?根据您想做的事情,您可以编写多种方法来帮助处理这些问题。对于这种模式,我建议编写如下内容: let or_else opt1 opt2 = match opt1 with | Some _ -> opt1 | None -> opt2 然后将代码重组为: let e
匹配中始终处理Some
案例和None
案例很麻烦。。。使用
比如说,,
是否有其他方法以简洁的方式解构选项类型?根据您想做的事情,您可以编写多种方法来帮助处理这些问题。对于这种模式,我建议编写如下内容:
let or_else opt1 opt2 = match opt1 with
| Some _ -> opt1
| None -> opt2
然后将代码重组为:
let env2 = List.map (fun ((it,ie),v,t) ->
match (or_else opt1 opt2) with
| Some t -> (v,t)
| None -> failwith "Cannot infer local vars") ls_res in
如果您有超过此数量的选项,则可以在列表中将它们折叠起来:
let a = [None; None; Some 1; Some 2;];;
List.fold a ~init:None ~f:or_else;;
对于简单的情况,您可以同时匹配多个内容:
match t, it with
| Some t, _ -> (v, t)
| None, Some it -> (v, it)
| None, None -> failwith "Cannot infer local vars"
这是我一直在做的事情。我听说编译器对这个构造很好(它实际上不会生成额外的一对)。- 选项monad(又名monad,可能是monad)。注意,Haskell中的
在OCaml中是Just
,Haskell中的Some
在OCaml中是Nothing
李>None
- 高阶函数:
默认值:
,a选项->'a
,映射选项:('a->'b)->'a选项->'b选项
如在另一个答案中,或其他
,映射一些:('a->'b选项)>'a列表->'b列表
等等。我的名字可能不标准集中一些:'a选项列表->'a列表
- 如果你遇到麻烦,
,unsome:'a option->'a
。实际上,如果您有更高阶的函数来处理普遍存在的让unsome=function a->a | None->raise Not _found
异常,这将非常有用Not\u found
选项类中将其定义为first\u some
,因此它位于标准库中,尽管我发现或_else
更为明显(我本可以看一下lambda代码,但我已经知道一种汇编语言,所以实际上对我来说工作更少)我很失望。令人印象深刻的优化就在那些看起来被遗忘的明显案例旁边。在手头的案例中,对caml_alloc2
的两个调用不应该存在(但是存在):这是个累赘,但我仍然喜欢这种简单案例的清晰匹配。
match t, it with
| Some t, _ -> (v, t)
| None, Some it -> (v, it)
| None, None -> failwith "Cannot infer local vars"