x的多个声明

Mic*_*ron 31 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}
Run Code Online (Sandbox Code Playgroud)

GS *_*ica 41

不,目前不支持此功能.标准的做法是前缀每个字段的东西所特有的特定数据类型,例如p2x,p2y,p3x等.

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

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

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

  • 遗憾的是,我们没有针对这种情况的解决方案. (2认同)

pal*_*lik 5

DuplicateRecordFields现有的哈斯克尔记录扩展允许使用重复字段标签.

请参见DuplicateRecordFields

使用ghc-8.0.2,OverloadedRecordFields对我不起作用