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

为什么这不起作用?

4

3 回答 3

20

在 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

于 2012-09-05T19:50:54.603 回答
10

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

# 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 时您必须决定要做什么)。

于 2012-09-05T19:51:52.967 回答
5

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

let get_exn = function
  | Some x -> x
  | None   -> raise (Invalid_argument "Option.get")
于 2012-09-09T06:02:00.050 回答