【发布时间】:2014-01-12 05:22:07
【问题描述】:
我听说 Haskell 被描述为具有结构类型。据我了解,记录是一个例外。例如,foo 不能用 HRec2 类型的东西调用,即使 HRec 和 HRec2 在它们的字段上只是名义上不同。
data HRec = HRec { x :: Int, y :: Bool }
data HRec2 = HRec2 { p :: Int, q :: Bool }
foo :: HRec -> Bool
是否有一些解释拒绝将结构类型扩展到包括记录在内的所有内容?
是否存在具有结构类型的静态类型语言,即使对于记录也是如此?对于所有静态类型的语言,我是否可以阅读有关这方面的一些争论?
【问题讨论】:
-
这似乎更像是一个邮件列表问题,而不是一个 SO 问题——研究语言演变历史和基本原理并不是真正的编程问题。但我并没有真正致力于这个想法。
-
我不会将记录视为例外。 Haskell 的打字通常是非常名义上的,而不是结构性的。
-
在有人为此问题提供“结构类型”的精确定义之前,这个问题没有意义。我所知道的结构类型的唯一意义是与函数的松散类比:
(a -> b -> Bool) -> [a] -> b -> Bool类型的函数接受任何匹配的函数作为其(第一个)参数。但这不是人们通常所说的“结构”或“鸭子”打字的意思。 -
OCaml 具有结构类型的记录,它不认为这些记录类型在结构上是等效的。您可以说这是因为它将字段名称视为记录类型结构的一部分。 (这也是 OCaml 在其对象系统中处理结构等价的方式:名称很重要。)
标签: haskell record structural-typing