我有这段代码,但是它无法编译,将 Point3 右侧的 x 和 y 标出并写上:"Multiple declarations of x" 和 "Multiple declarations of y"。怎么回事?Point2 和 Point3 不能有相同的成员名称吗?
data Point2 = Point2 {x :: Float, y :: Float}
data Point3 = Point3 {x :: Float, y :: Float, z :: Float}
我有这段代码,但是它无法编译,将 Point3 右侧的 x 和 y 标出并写上:"Multiple declarations of x" 和 "Multiple declarations of y"。怎么回事?Point2 和 Point3 不能有相同的成员名称吗?
data Point2 = Point2 {x :: Float, y :: Float}
data Point3 = Point3 {x :: Float, y :: Float, z :: Float}
目前不支持这样做。标准的方法是在每个字段前面添加一些特定于特定数据类型的唯一前缀,例如 p2x
、p2y
、p3x
等。
之所以不支持这种方式,是因为每个记录字段名隐式生成一个“选择器”函数,例如 x :: Point2 -> Float
。在同一作用域中具有相同名称的两个字段会生成冲突。
这是很多人长期以来的烦恼,将通过即将推出的语言扩展 OverloadedRecordFields
得到解决,它有望成为 GHC 7.12 的一部分(预计在 2016 年初发布)。
启用此扩展后,将允许在多个记录中使用相同的字段名。字段选择器将具有重载类型,通常由类型推断解析。
“DuplicateRecordFields”扩展允许现有的Haskell记录使用重复的字段标签。
OverloadedRecordFields在ghc-8.0.2版本中无法正常工作。
DisambiguateRecordFields
уџёуЏ«уџёТў»С╗ђС╣ѕ№╝Ъ - Erik Kaplun