记录和元组之间有什么区别,而不仅仅是语法上的区别?
有性能差异吗?
元组和记录的实现是否相同?
您是否有可以使用元组但不能使用记录(反之亦然)完成的事情的示例?
模数语法它们几乎相同。主要的语义区别在于元组是结构类型,而记录是名义类型。这意味着例如记录可以是递归的,而元组不能(至少在没有 -rectypes 选项的情况下不能):
type t = {a : int, b : unit -> t} (* fine *)
type u = int * (unit -> u) (* error *)
此外,记录可以有可变字段,元组不能。
FWIW,在 OCaml 的姊妹语言 SML 中,元组是记录。也就是说,在 SML 中 (a,b,c) 只是 {1=a,2=b,3=c} 的语法糖,记录也是结构类型。
仅浮点记录或数组中的浮点字段未装箱存储,而此类优化不适用于元组。如果您要存储大量浮点数并且仅存储浮点数,那么使用记录很重要——您可以通过拆分混合浮点数/其他数据结构来获得内部仅浮点数记录。
其他差异在类型级别,Andreas 已经描述过——记录是生成的,而元组是预先存在的并且具有结构语义。如果您想要具有多态访问器的结构记录,您可以使用对象类型。