目前我使用数据fields
来模仿C结构。但我发现,与域驱动的编程方式(如object.property
)不同,在haskell中,属性名称都被转储到模块名称空间中。当我有多个这样的结构时,这会产生一些问题。例如,如果我有两种数据类型,那该怎么办:
data Person = Person { name :: Text, address :: Text }
data Dog = Dog { name :: Text, breed :: Text }
然后GHC会抱怨:Multiple declarations of ‘name’
。因此,我必须命名"属性"带前缀:
data Person = Person { getPersonName :: Text, getPersonAddress :: Text }
data Dog = Dog { getDogName :: Text, getDogBreed :: Text }
这是必要的吗?或者我使用错误的方法来定义结构?
答案 0 :(得分:3)
您可以使用-XDisambiguateRecordFields
扩展程序。它允许这样:在多个数据声明中使用相同名称的记录标签。
但是,您应该考虑是否真的需要这样做。如果两个数据类型包含相同的概念性事物,那么从两种类型中删除该字段并将其用于常见的包装器中可能更好吗?
data Person' = Person { address :: Text }
data Dog' = Dog { breed :: Text }
data Named b = Named { name :: Text, being :: b }
type Person = Named Person'
type Dog = Named Dog'