OCaml 中有什么

What is Some in OCaml

此 Ocaml 代码遍历列表并输出最后一个元素。

我不明白我们输出的第二个条件Some x

let rec last = function 
| [] -> None 
| x::[] -> Some x
| _ :: t -> last t ;;

Someoption 类型的构造函数。 None 是另一个构造函数。考虑以下 option.

的定义
type 'a option = None | Some of 'a

这样做的最终效果是为函数提供 选项 到 return 一个值,或者一个不代表任何内容的值。想象一下,我想在列表中搜索项目的索引。如果该值不在列表中,我应该 return 怎么办?

let find_index value lst = 
  let rec aux value lst idx =
    match lst with
    | [] -> None
    | x::_ when x = value -> Some idx 
    | _::xs -> aux value xs (idx + 1)
  in
  aux value lst 0
utop # find_index 4 [1; 8; 2; 5; 4; 10];;
- : int option = Some 4
─( 17:10:49 )─< command 3 >──────────────────────────────────────{ counter: 0 }─
utop # find_index 4 [1; 8; 2; 5; 7; 10];;
- : int option = None

两个值的类型都是 int option,所以 OCaml 的类型系统很满意。

在您的示例中,空列表没有 last 元素,因此您 return None.

然后我们可以对此进行模式匹配来处理这两种情况:

let some_list = [2; 3; 4]

let () =
  match last some_list with
  | None -> print_endline "This list doesn't have a last item."
  | Some item -> print_endline ("The last item found was " ^ string_of_int item)

您可能 运行 进入了通过 return 特殊错误值处理此类情况的语言。例如,我们可以 return -1。或者我们可以抛出一个 ValueNotFound 异常。