OCaml 中的 Some 是什么

问题描述 投票:0回答:1

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

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

Some x

let rec last = function 
| [] -> None 
| x::[] -> Some x
| _ :: t -> last t ;;
  • 因此,如果列表为空,我们将返回 null。
  • 如果 x 是我们返回的最后一个元素
    Some x
    (*在此上下文中 Some x 是什么?*)
  • 如果 x 不是最后一个元素,我们将在列表中继续前进。
functional-programming match ocaml algebraic-data-types option-type
1个回答
3
投票

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
异常。

© www.soinside.com 2019 - 2024. All rights reserved.