【问题标题】:What's the difference between records and tuples in OCamlOCaml 中的记录和元组有什么区别
【发布时间】:2012-05-07 12:15:18
【问题描述】:

记录和元组之间有什么不只是句法上的区别吗?

有性能差异吗?

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

您是否有可以使用元组但不能使用记录来完成的事情的示例(以及 反过来)?

【问题讨论】:

  • 是什么导致了这样的问题?它们适用于不同的应用程序。我不会担心现阶段的表现。实现并不“相同”,因为……它们是不同的东西。
  • 如果它们是不同的东西,那么您是否有可以使用元组但不能使用记录(反之亦然)完成的事情的示例?我问这个问题是因为你说的不同的两件事在我看来很相似。
  • 定义“可以完成”。原谅那种傲慢的语气,但任何事情都可以用图灵机完成。记录只是提供更容易的访问,即您不需要为了获得一个元素而解构整个事物。它们具有更好的文档记录,并且更易于访问,允许使用 mutable 关键字和 <- 语法更轻松地更新引用。
  • 我的意思是,你会同意列表和元组是不同的,对吧?但是,如果您很傻,它们可以相同地使用。
  • @Len:那是苹果和橘子。托马斯的问题是完全有效的。类型理论上,元组和记录都只是产品类型(一个未标记,另一个标记,但这是一个相对较小的差异),具有恒定的宽度但异构组件。 OCaml 两者兼有(加上对象类型作为产品的第三种形式)确实有点多余。然而,列表是递归和类型,具有未指定的长度但同质组件,因此完全不同。

标签: ocaml


【解决方案1】:

模数语法它们几乎相同。主要的语义区别在于元组是结构类型,而记录是名义类型。这意味着例如记录可以递归,而元组不能(至少在没有 -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} 的语法糖,记录也是结构类型。

【讨论】:

  • Re: 可变字段,没有什么能阻止你定义type v = int * int ref 然后说snd some_v := 90210
  • 感谢您的回答。您了解性能差异吗?
  • @Len:是的,但这实际上是嵌套在 OCaml 中的元组中的记录,其中 'a ref = {mutable content: 'a}。也就是说,你有一个额外的间接性。最终,可变性总是与记录相关联。
  • @Thomash:性能方面应该没有区别。两者都编译成同一个东西。
  • 浮点值例外。与仅包含浮点元素的元组(浮点数被装箱)相比,仅包含浮点字段的记录将被编译为更有效的形式(浮点数未装箱)。
【解决方案2】:

仅浮点记录或数组中的浮点字段未装箱存储,而此类优化不适用于元组。如果您要存储大量浮点数并且只存储浮点数,那么使用记录很重要——您可以通过拆分混合浮点数/其他数据结构以获得内部仅浮点记录来获得收益。

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

【讨论】:

    猜你喜欢
    • 2015-09-27
    • 1970-01-01
    • 2010-10-16
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多