多个x的声明

34

我有这段代码,但是它无法编译,将 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}
2个回答

45

目前不支持这样做。标准的方法是在每个字段前面添加一些特定于特定数据类型的唯一前缀,例如 p2xp2yp3x 等。

之所以不支持这种方式,是因为每个记录字段名隐式生成一个“选择器”函数,例如 x :: Point2 -> Float。在同一作用域中具有相同名称的两个字段会生成冲突。

这是很多人长期以来的烦恼,将通过即将推出的语言扩展 OverloadedRecordFields 得到解决,它有望成为 GHC 7.12 的一部分(预计在 2016 年初发布)。

启用此扩展后,将允许在多个记录中使用相同的字段名。字段选择器将具有重载类型,通常由类型推断解析。


2
很遗憾,我们没有针对这种情况的解决方案。 - jiyinyiyong
СйєТў»DisambiguateRecordFieldsуџёуЏ«уџёТў»С╗ђС╣ѕ№╝Ъ - Erik Kaplun
我使用DuplicateRecordFields,因为OverloadedRecordFields无法工作。 - luochen1990

7

谢谢,我想我应该查看一下GHC发行说明。这是我最大的投诉之一! - Nick Acosta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接