OCaml中记录和元组之间的区别是什么

Tho*_*ash 5 ocaml

记录和元组之间是否存在差异,这不仅仅是语法差异?

有性能差异吗?

元组和记录的实现是否相同?

您是否有使用元组可以完成的事情的例子,但没有记录(反过来)?

And*_*erg 15

Modulo语法几乎相同.主要的语义差异是元组是结构类型,而记录是名义类型.这意味着例如记录可以递归而元组不能(至少没有-rectypes选项):

type t = {a : int, b : unit -> t}  (* fine *)
type u = int * (unit -> u)         (* error *)
Run Code Online (Sandbox Code Playgroud)

而且,记录可以有可变字段,元组不能.

FWIW,在OCaml的姐妹语言SML中,元组记录.也就是说,在SML(a,b,c)中,{1 = a,2 = b,3 = c}只是语法糖,记录也是结构类型.

  • 浮点值例外.仅包含浮点字段的记录将被编译为更高效的形式(浮动是未装箱的),而不是仅具有浮点元素的元组(浮动框被加框). (3认同)

gas*_*che 10

浮动记录或数组中的浮点字段是未装箱的,而没有这样的优化适用于元组.如果要存储大量浮点数并且只存储浮点数,则使用记录非常重要 - 您可以通过拆分混合浮点数/其他数据结构来获得内部浮动记录.

其他差异在类型级别,并且已经由Andreas描述 - 记录是生成的,而元组预先存在并且具有结构语义.如果您想要具有多态访问器的结构记录,则可以使用对象类型.