OCaml选项得到

时间:2012-09-05 19:42:54

标签: ocaml option

我是OCaml的新手,我正在努力了解你应该如何从一个选项中获得价值。根据{{​​3}}的文档,有一个'a option - >类型的get函数。 '做我想做的事。但是当我输入时:

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

为什么这不起作用?

3 个答案:

答案 0 :(得分:17)

在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:此模式匹配并非详尽无遗。这是一个例子   不匹配的值:一些无

答案 1 :(得分: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时你想做什么。

答案 2 :(得分:5)

你应该听听上面关于类型安全的海报建议,但也要注意不安全的功能,如Option.get(电池btw中可用)通常以exn为后缀。如果你很好奇,那么可以实现Option.get或Option.get_exn:

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