ocaml中的{X带值}

ocaml中的{X带值},ocaml,Ocaml,我看到了以下函数调用: 我可以看到一个函数调用,第一个参数是record initialized,第二个参数是ast 我不熟悉的是表单的语法: {Visitor_c.default_visitor_c with Visitor_c.kexpr = some_value;} 这意味着什么?我知道记录可以像{name=value;name=value;…}那样初始化,但我不熟悉{X with name=value},你能告诉我它的意思吗 除了以下内容外,我在“无关于合法记录值初始化的内容”中找不到

我看到了以下函数调用:

我可以看到一个函数调用,第一个参数是record initialized,第二个参数是
ast

我不熟悉的是表单的语法:

{Visitor_c.default_visitor_c with Visitor_c.kexpr = some_value;}
这意味着什么?我知道记录可以像
{name=value;name=value;…}
那样初始化,但我不熟悉
{X with name=value}
,你能告诉我它的意思吗

除了以下内容外,我在“无关于合法记录值初始化的内容”中找不到其他内容:

6.2.3记录

记录值标记为的元组 价值观写入的记录值{ field1=v1;…;fieldn=vn} 将值vi与记录相关联 字段i,对于i=1…n。这个 当前的实现支持 高达222条的记录− 1字段 (4194303个字段)


如果您能在回答中引用OCaml手册中的相关章节,我将非常高兴。

这有时被称为“记录更新”或“功能更新”之类的内容。它计算为与X类型相同的新记录,其字段初始化为与X中的字段相同的字段,但“with”后面列出的字段初始化为给定值

它对于不可变记录很有用,可以方便地获取这样的记录并更改其中的一个或两个内容(在命令式语言中,您通常会更改字段),而不必列出所有未更改的字段

OCaml手册中有描述,向下滚动至“记录”,第二段

对于熟悉Haskell的人来说,OCaml语法

{ expr with field1 = expr1 ; ... ;  fieldn = exprn }
与Haskell语法相同

expr { field1 = expr1 , ... ,  fieldn = exprn }

要更正以前的答复,新记录的类型并不总是与旧记录的类型相同。 例如,您可以有如下内容:

type 'a t = {
  id : int;
  value : 'a;
}
let old_t = { id = 3; value = "foo" }
let new_t = { old_t with value = 3 }

因此,
old\u t
的类型为
string t
,而
new\u t
的类型为
int t
,谢谢。我怎么能用谷歌搜索呢?这本手册很深,我很难找到。我不知道你怎么用谷歌搜索它。我只是碰巧知道这个。但在该页面的顶部(第6.7节)列出了OCaml中所有有效表达式的语法,因此,如果您想理解一个表达式,可以先从那里开始,如果您看到它,请向下滚动到描述它的相应部分。总的来说,第6章讨论了OCaml语言语法的各个方面;这里有关于类型表达式、模式、类、模块等的部分。因此,如果您需要查找任何内容,我将首先从相应的部分开始。哇,我不知道您可以继续列出
fieldn=expern。谢谢
type 'a t = {
  id : int;
  value : 'a;
}
let old_t = { id = 3; value = "foo" }
let new_t = { old_t with value = 3 }