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

什么';这是OCaml中记录和元组之间的区别,ocaml,Ocaml,记录和元组之间是否存在不仅仅是语法差异的差异 是否存在性能差异 元组和记录的实现是否相同 您是否有可以使用元组但不使用记录(以及 相反地,它们的模语法几乎相同。主要的语义区别在于元组是结构类型,而记录是名词类型。这意味着,例如,记录可以是递归的,而元组不能(至少在没有-rectypes选项的情况下): 此外,记录可以有可变字段,元组不能 在OCaml的姐妹语言SML中,元组是记录。也就是说,在SML中(a,b,c)只是{1=a,2=b,3=c}的语法糖,记录也是结构类型。浮点型中的浮点型字段只有

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

是否存在性能差异

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

您是否有可以使用元组但不使用记录(以及
相反地,它们的模语法几乎相同。主要的语义区别在于元组是结构类型,而记录是名词类型。这意味着,例如,记录可以是递归的,而元组不能(至少在没有-rectypes选项的情况下):

此外,记录可以有可变字段,元组不能


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

浮点型中的浮点型字段只有记录或数组是非装箱存储的,而元组则没有这种优化。如果要存储大量浮点且仅存储浮点,那么使用记录很重要——通过将混合浮点/其他数据结构拆分为具有内部仅浮点记录,您可以从中获益


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

这类问题是什么导致的?它们适合不同的应用。在这个阶段,我不会担心表现。实现不是“相同的”,因为……它们是不同的东西。如果它们是不同的东西,那么您是否有可以使用元组但不使用记录(反之亦然)的例子?我问这个问题是因为你所说的两件不同的事情似乎与我非常相似。定义“可以做到”。请原谅这种傲慢的语气,但任何事情都可以用图灵机器来完成。记录只是提供了更容易的访问,也就是说,你不需要为了得到一个元素而解构整个东西。它们可以更好地进行文档记录,并且更容易访问,允许使用
mutable
关键字和
更容易地更新引用,我的意思是,你会同意列表和元组是不同的,对吗?然而,如果你傻的话,它们可以被同样地使用。@Len:那是苹果和桔子。托马什的问题完全正确。类型理论上,元组和记录都只是产品类型(一个未标记,另一个已标记,但这是一个相对较小的差异),具有恒定的宽度但具有异构组件。OCaml同时具有这两种类型(以及作为第三种产品形式的对象类型),这确实有些多余。然而,列表是递归和类型,具有未指定的长度但具有相同的组件,因此完全不同。Re:mutable fields,没有什么能阻止您定义
type v=int*int ref
,然后说
snd some\u v:=90210
。谢谢您的回答。你知道性能差异吗?@Len:是的,但那实际上是一条嵌套在OCaml元组中的记录,其中'a ref={mutable content:'a}。也就是说,你有一个额外的间接性。归根结底,易变性总是与记录联系在一起。@Thomash:从性能角度看,应该没有任何区别。两者编译为同一事物。浮点值例外。仅包含浮点字段的记录将被编译为比仅包含浮点元素的元组(浮点已装箱)更有效的形式(浮点未装箱)。
type t = {a : int, b : unit -> t}  (* fine *)
type u = int * (unit -> u)         (* error *)