如何在 OCaml 中模式匹配相同的案例?

How to pattern match identical cases in OCaml?

例如,怎样写比较简洁

let rec sum3 a = match a with
| [] -> false
| 1::2::xs -> true
| 2::1::xs -> true
| _::xs -> sum3 xs

这两种情况并不相同。列表是一个序列,而不是一个集合(即,顺序很重要)。

除非你有一个更大的例子,否则我看不到很多可能的改进。下面稍微简洁一点:

let rec sum3 = function
| [] -> false
| 1 :: 2 :: _ | 2 :: 1 :: _ -> true
| _ :: t -> sum3 t

从你的函数名称来看,我猜你想测试两个连续数字的总和是否为 3,在这种情况下,我会像这样编写函数:

let rec sum3 = function
| [] -> false
| a :: b :: _ when a + b = 3 -> true
| _ :: t -> sum3 t