由相同数据类型的不同构造函数共享的 Haskell 记录访问器

2024-04-24

关于 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 书籍中看到过有关记录访问器函数的规则。有人可以对我上面看到的行为给出更深入的解释吗?


来自Haskell '98 报告 http://www.haskell.org/onlinereport/decls.html:

数据声明可以在多个构造函数中使用相同的字段标签,只要类型同义词扩展后字段的类型在所有情况下都相同。一个标签不能被范围内的多个类型共享。字段名称与普通变量和类方法共享顶级命名空间,并且不得与范围内的其他顶级名称冲突。

我认为没有什么更深入的内容了。正如您所说,生成的字段访问器具有类型Pet -> String无论如何,所决定的权力可以方便地允许您在不同的构造函数中重复使用相同的字段名称。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由相同数据类型的不同构造函数共享的 Haskell 记录访问器 的相关文章

随机推荐