在OCaml 4.01.0中缺少Option.default

cyb*_*101 2 ocaml ml

我要用它String.Set.choose some_set从一组中挑选一个字符串.

这个方法返回StringOption,但我想使用另一个方法,返回值为第二个,因此我想将StringOption转换为字符串.

我知道根据OCaml docs(链接在这里) Option.default应该这样做但是由于某种原因它缺失(尽管 Option其他所有方法都存在).

有没有办法解决这个问题或让我的下一个方法接受StringOption?

谢谢,

Jef*_*eld 5

首先,那些不是OCaml文档:-)它是一个附加库.该特定存储库已过时(与Sourceforge上几乎所有其他存储库一样),其Option模块已合并到OCaml Batteries中,作为BatOption模块.电池也是一个附加库,但是使用最广泛的库之一.

您可以编写自己的函数来从字符串选项中提取字符串,只要您确定实际值时要执行的操作即可None.在那种情况下,当然没有字符串.

一种可能性就是在这种情况下提出例外.如果你是积极的,总会有一个字符串,那么异常永远不会发生.如果确实发生了,你知道你有问题.所以,你可以写一个这样的函数:

let string_of_string_option so =
    match so with
    | None -> failwith "string_of_string_option, no string"
    | Some str -> str
Run Code Online (Sandbox Code Playgroud)

(此函数的作用类似List.hd;即,它是一个部分函数,​​当输入无效时会引发异常.)

你也可以写自己的版本default; 这是一个非常简单的功能:

let my_default dflt vo =
    match vo with
    | None -> dflt
    | Some v -> v
Run Code Online (Sandbox Code Playgroud)

获取当前OCaml文档的一个好方法是通过ocaml.org.

另一个非常受欢迎的附加库是Jane Street Core,在这里描述.它有一个名为的函数Option.value,类似于default您正在寻找的函数.(事实上​​,这个名字对我来说似乎好一点.)