如何在不同的名称空间中放置haskell字段名称?

Moz*_*lah 5 haskell

考虑以下两种类型:

data Point=Point{x::Float,y::Float}
data Rectangle = {upperLeft::Point, bottomRight::Point}
data Square = {upperLeft::Point, bottomRight::Point}
Run Code Online (Sandbox Code Playgroud)

ghc编译器抱怨Rectangle中的upperLeft字段名称与Square的字段名称冲突.这看起来很奇怪,因为从表面上看,每个字段名称都应该在该类型的命名空间中,否则一个人不能重用字段名称,我怀疑这将是一个足够普遍的期望.

例如,要定义我们编写的变量:

let a=Rectangle{upperLeft=Point 2 3, bottomRight=Point 7 7}
let a=Square{upperLeft=Point 2 3, bottomRight=Point 7 7}
Run Code Online (Sandbox Code Playgroud)

由此我们可以看出,我们应该能够期望每个字段名称应该在它们各自的类型名称空间内.

我的用法是正确的还是我的期望错了?有没有办法解决这个问题?

ast*_*nna 3

在 Haskell 中,创建记录类型也会创建访问器函数。例如,您可以x (upperLeft a)在上面定义的任一变量上运行: 来获取 2。这是记录语法的摘要

您可以选择在记录上使用不同的字段名称,或者将它们放在单独的模块中。因为每个模块都有自己的名称空间,所以如果将 Square 放入 Square 模块中,将 Rectangle 放入 Rectangle 模块中,则可以重用字段名称。