我是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
为什么这不起作用?
答案 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")