在OCaml 4.01.0中缺少Option.default

时间:2015-06-13 15:26:19

标签: ocaml ml

我要使用String.Set.choose some_set从集合中挑选字符串。

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

根据OCaml文档(link here)我知道Option.default应该这样做但是由于某种原因它会丢失(尽管Option与其余所有方法存在)。

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

谢谢,

1 个答案:

答案 0 :(得分:5)

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

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

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

let string_of_string_option so =
    match so with
    | None -> failwith "string_of_string_option, no string"
    | Some str -> str

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

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

let my_default dflt vo =
    match vo with
    | None -> dflt
    | Some v -> v

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

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