在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

OCaml的选项类型在函数可能不返回任何内容的情况下非常有用。但是当我在很多地方使用它时,我发现在
匹配中始终处理
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中的
    Just
    在OCaml中是
    Some
    ,Haskell中的
    Nothing
    在OCaml中是
    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
    异常,这将非常有用

我想可能不是,但我不明白为什么。Jane Street的核心库在他们自己的
选项
类中将其定义为
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"