Ocaml记录匹配

Ocaml记录匹配,ocaml,Ocaml,有基本记录 type t = {a:string;b:string;c:string} 这段代码为什么要编译 let f t = match t with {a;b;_} -> a 但是这个 let f t = match t with {_;b;c} -> b 及 不是吗?我问这个问题是出于好奇,因此是一些明显无用的代码示例。可选的\u字段必须是最后一个字段。这在中作为语言扩展进行了记录 以下是制作参考: pattern ::= ... ∣ '{'

有基本记录

type t = {a:string;b:string;c:string}
这段代码为什么要编译

let f t = match t with
    {a;b;_} -> a
但是这个

let f t = match t with
    {_;b;c} -> b


不是吗?我问这个问题是出于好奇,因此是一些明显无用的代码示例。

可选的
\u
字段必须是最后一个字段。这在中作为语言扩展进行了记录

以下是制作参考:

pattern ::= ...  
    ∣ '{' field ['=' pattern]  { ';' field  ['=' pattern] }  [';' '_' ] [';'] '}'

因为后两个例子在语法上是不正确的。该语法允许您使用下划线终止字段名模式,以通知编译器您知道,存在的字段比您试图匹配的字段多。它用于抑制警告(默认情况下禁用)。以下是政府对此的看法:

或者,记录模式可以通过以下方式终止;\u表示并非记录类型的所有字段都列在记录模式中,并且这是有意的。默认情况下,编译器忽略;\u注释。如果启用了警告9,则当记录模式未能列出相应记录类型的所有字段且未以;\终止时,编译器将发出警告。继续上面的例子

如果要匹配名称而不将其绑定到变量,则应使用以下语法:

{a=_; b; c}
例如:


除了杰弗里·斯科菲尔德(Jeffrey Scofield)和伊夫格(ivg)的答案之外,错误示例试图实现的目标实际上可以通过使用不同的字段顺序来实现。像这样:

let f t = match t with
  {b;c;_} -> b

你有什么错误?
let {a=_; b; c} = {a="hello"; c="cruel"; b="world"};;
val b : string = world
val c : string = cruel
let f t = match t with
  {b;c;_} -> b