【发布时间】:2010-07-19 00:47:43
【问题描述】:
从各种 OO 语言的背景来到 Haskell,对我来说似乎有点缺点的一件事是函数和字段名称的范围不限于它们所关联的类型,因此它很容易运行如果不同的数据类型具有相同名称的字段,则会发生冲突。
如果我有这三个模块:
module One where
data Foo a = Foo { value :: a }
----
module Two where
data Bar a = Bar { value :: a }
----
module Three where
import One
import Two
foo = Foo { value = 42 } -- compile error here
n = value foo -- and here
模块Three 中对value 的非限定引用被认为是模棱两可的,即使两个导入的名称中只有一个在这种情况下有意义。 (在 OO 语言中,对 foo.value 和 bar.value 的引用是明确的。)
当然,我可以写Foo { One.value = 42 } 来消除歧义,但这看起来很尴尬。我也可以以不同的方式命名字段,例如“fooValue”和“barValue”,但Foo { fooValue = 42 } 中的冗余看起来也很尴尬。
这实际上是一个特殊情况,即不同模块中的函数具有相同的名称但在不同的、不相关的类型上运行的更普遍的问题。不过,我似乎更经常遇到字段名称。例如,我有几个数据类型,它们与类型类无关,但经常一起使用,它们包含颜色值,所以我希望每个数据类型都有一个名为“color”的字段。
有经验的 Haskell 开发人员如何命名事物并将它们组织成模块,以避免这种情况?
【问题讨论】:
-
次要问题:您在
Bar的定义中缺少构造函数。 -
@Travis Brown:哎呀,这是一个错字。感谢您指出。