【问题标题】:OCaml Option getOCaml 选项获取
【发布时间】:2012-08-30 14:20:11
【问题描述】:

我是 OCaml 的新手,我试图了解您应该如何从“a 选项”中获取价值。根据http://ocaml-lib.sourceforge.net/doc/Option.html 的文档,有一个'a option -> 'a 类型的get 函数可以满足我的要求。但是当我输入时:

# let z = Some 3;;
val z : int option = Some 3
# get z;;
Error: Unbound value get
# Option.get z;;
Error: Unbound module Option

为什么这不起作用?

【问题讨论】:

  • 您正在查看 ocaml-lib 的文档,它是 OCaml 的可选实用程序库。当然,您不需要该库来访问 Some 构造函数中的值。

标签: ocaml option


【解决方案1】:

在 OCaml 中获取任何类型的构造函数中的值的传统方法是使用模式匹配。模式匹配是 OCaml 的一部分,可能与您在其他语言中看到的最不同,所以我建议您不要只是按照您习惯的方式编写程序(例如规避 ocaml-lib 的问题) 而是尝试一下,看看你是否喜欢它。

let contents = 
   match z with
   Some c -> c;;

变量contents 被分配了3,但是你得到一个警告:

警告 8:这种模式匹配并不详尽。这是一个例子 不匹配的值:无

在一般情况下,您不会知道要查看的表达式一定是Some c。选择选项类型的原因通常是有时该值可以是None。在这里,编译器会提醒您,您没有处理其中一种可能的情况。

您可以“深度”进行模式匹配,编译器仍会检查穷举。考虑这个接受(int option) option的函数:

let f x =
  match x with
  Some (Some c) -> c
  | None -> 0
  ;;

这里你忘记了Some (None) 的情况,编译器告诉你:

警告 8:这种模式匹配并不详尽。这是一个例子 不匹配的值:Some None

【讨论】:

  • 值得一提的是,你的第一个例子相当于let Some c = z in c
  • 在这个答案中,我专门使用 match with 进行模式匹配,因为后者是手头的主题,我认为一开始将它与单个结构相关联并不会有什么坏处。
  • 我同意你的看法,这就是为什么我添加了这个 factoid 作为评论 ;)
【解决方案2】:

通常的方法是使用模式匹配。

# let x = Some 4;;
val x : int option = Some 4

# match x with
  | None -> Printf.printf "saw nothing at all\n"
  | Some v -> Printf.printf "saw %d\n" v;;
saw 4
- : unit = ()

您可以编写自己的 get 函数(尽管您必须决定 当值为 None 时你想做什么)。

【讨论】:

  • 这是一个很好的答案。为了扩展该示例,让我们让 x 保存一个字符串并打印:gist.github.com/shehaaz/7165109 因此,您可能可以编写一个处理所有类型的通用函数。
【解决方案3】:

您应该听取上述海报关于类型安全的建议,但也要注意不安全的函数,例如 Option.get(顺便说一句,在电池中可用)通常带有 exn 后缀。如果你很好奇,那么 Option.get 或 Option.get_exn 是如何实现的:

let get_exn = function
  | Some x -> x
  | None   -> raise (Invalid_argument "Option.get")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    相关资源
    最近更新 更多