此 Ocaml 代码遍历列表并输出最后一个元素。
我不明白我们输出的第二个条件
Some x
let rec last = function
| [] -> None
| x::[] -> Some x
| _ :: t -> last t ;;
Some x
(*在此上下文中 Some x 是什么?*)Some
是 option
类型的构造函数。 None
是另一个构造函数。考虑以下 option
的定义。
type 'a option = None | Some of 'a
这样做的最终效果是为函数提供一个选项来返回一个值,或者一个不代表任何内容的值。想象一下我想搜索列表中某个项目的索引。如果该值不在列表中,我应该返回什么?
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
# find_index 4 [1; 8; 2; 5; 4; 10];;
- : int option = Some 4
# find_index 4 [1; 8; 2; 5; 7; 10];;
- : int option = None
两个值都具有类型
int option
,因此 OCaml 的类型系统很满意。
在您的示例中,空列表没有
last
元素,因此您返回 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)
您可能遇到过通过返回特殊错误值来处理此类情况的语言。例如,我们可以返回
-1
。或者我们可以抛出一个 ValueNotFound
异常。