关于Haskell记录的基本问题。如果我定义了这个数据类型,
data Pet = Dog { name :: String } | Cat { name :: String } deriving (Show)
以下作品:
main = do
let d = Dog { name = "Spot" }
c = Cat { name = "Morris" }
putStrLn $ name d
putStrLn $ name c
但如果我这样做,
data Pet = Dog { name :: String } | Cat { name :: Integer } deriving (Show)
我会收到此错误:Multiple declarations of 'name'
。
我认为我直观地理解为什么会出现这种情况,因为第一种情况下name
的类型只是Pet -> String
而不管使用的构造函数如何。但我不记得在我读过的任何Haskell书籍中都看到过有关记录访问器功能的规则。有人可以对我上面看到的行为稍微深入一些解释吗?
答案 0 :(得分:7)
数据声明可以在多个构造函数中使用相同的字段标签,只要在类型同义词扩展后所有情况下字段的键入都相同。标签不能由范围内的多个类型共享。字段名称与普通变量和类方法共享顶级名称空间,并且不得与范围中的其他顶级名称冲突。
我认为没有更深入的内容。正如您所说,生成的字段访问器无论如何都具有类型Pet -> String
,因此可以方便地确定允许您在不同构造函数中重用相同字段名称的权限。