【问题标题】:OCaml list match patternOCaml 列表匹配模式
【发布时间】:2016-02-20 03:13:54
【问题描述】:

所以我正在编写一个简单的方法来总结列表中的前 3 个或更少的整数 但我对匹配模式感到困惑。
我目前有

let sums l = match l with
    | [] -> 0
    | (h1::h2::h3::_) -> h1+h2+h3
    | [h1;h2;h3] -> h1+h2+h3
    | [h1;h2] -> h1+h2
    | [h1] -> h1

这是否涵盖所有情况? 还有为什么 3 个或更多元素我不能写 [h1;h2;h3;_] 之类的东西?
对不起,如果这些问题看起来太简单了,我刚开始学习 OCaml,我在网上找不到这样的东西。

【问题讨论】:

  • 如果 Ocaml 认为模式没有涵盖所有情况,它会给你一个非常明确的警告。

标签: pattern-matching ocaml


【解决方案1】:

这是否涵盖所有情况?

是的,它们涵盖了所有情况,但我会写:

let sums l = match l with
  | [] -> 0
  | [h1] -> h1      
  | [h1; h2] -> h1+h2
  | h1 :: h2 :: h3 :: _ -> h1+h2+h3

您的[h1; h2; h3] 是多余的,因为h1 :: h2 :: h3 :: _ 匹配它(通配符为[]

为什么 3 个或更多元素我不能写类似 [h1;h2;h3;_] 的东西?

好吧,你就是不能。此语法无效。
编辑:对不起,我疯了。此语法是有效的,但它匹配四个元素的列表而不绑定最后一个元素,这不是您想要的。

【讨论】:

  • 谢谢,所以最好先匹配元素少的案例?
  • 没有。在这种情况下,不同的订单产生相同的代码。
  • 从技术上讲,[h1; h2; h3; _] 语法是有效的,它只匹配四个元素的列表,而不是 @Oxtis 想要的。