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年初到期).
启用后,此扩展名将允许在多个记录中使用相同的字段名称.字段选择器将具有重载类型,通常通过类型推断来解析.