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