我有这个代码并且它不会编译,突出显示Point3的x和y右边并写:" x"的多个声明和" y"的多个声明。怎么了?不能Point2和Point3具有相同的成员名称吗?
data Point2 = Point2 {x :: Float, y :: Float}
data Point3 = Point3 {x :: Float, y :: Float, z :: Float}
答案 0 :(得分:41)
不,目前不支持此功能。标准方法是在每个字段前面添加特定数据类型的唯一内容,例如: p2x
,p2y
,p3x
等。
不支持的原因是每个记录字段名称隐式生成一个"选择器"功能,例如x :: Point2 -> Float
。在同一范围内具有相同名称的两个字段将生成冲突。
对于许多人来说,这是一个长期存在的问题,将通过即将推出的语言扩展OverloadedRecordFields
来解决,这有望成为GHC 7.12的一部分(2016年初到期)。
启用后,此扩展名将允许在多个记录中使用相同的字段名称。字段选择器将具有重载类型,通常可以通过类型推断来解析。
答案 1 :(得分:5)
使用ghc-8.0.2
DuplicateRecordFields
扩展名允许现有的Haskell记录使用重复的字段标签。