x的多个声明

时间:2014-06-22 14:33:42

标签: haskell declaration

我有这个代码并且它不会编译,突出显示Point3的x和y右边并写:" x"的多个声明和" y"的多个声明。怎么了?不能Point2和Point3具有相同的成员名称吗?

data Point2     = Point2 {x :: Float, y :: Float}
data Point3     = Point3 {x :: Float, y :: Float, z :: Float}

2 个答案:

答案 0 :(得分:41)

不,目前不支持此功能。标准方法是在每个字段前面添加特定数据类型的唯一内容,例如: p2xp2yp3x等。

不支持的原因是每个记录字段名称隐式生成一个"选择器"功能,例如x :: Point2 -> Float。在同一范围内具有相同名称的两个字段将生成冲突。

对于许多人来说,这是一个长期存在的问题,将通过即将推出的语言扩展OverloadedRecordFields来解决,这有望成为GHC 7.12的一部分(2016年初到期)。

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

答案 1 :(得分:5)

  

DuplicateRecordFields扩展名允许现有的Haskell记录使用重复的字段标签。

请参阅DuplicateRecordFields

使用ghc-8.0.2

OverloadedRecordFields对我无效