Haskell中不同数据类型的字段标签之间的名称冲突

Wyz*_*a-- 15 syntax haskell

从各种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
Run Code Online (Sandbox Code Playgroud)

value模块Three内的非限定引用被认为是模糊的,即使在这种情况下只有两个导入名称中的一个有意义.(在OO语言中,引用foo.value并且bar.value将是明确的.)

当然,我可以通过写作消除歧义Foo { One.value = 42 },但这看起来很尴尬.我也可以用不同的方式命名字段,例如"fooValue"和"barValue",但冗余也Foo { fooValue = 42 }看起来很尴尬.

这实际上是不同模块中更一般的函数问题的特殊情况,这些函数具有相同的名称但在不同的不相关类型上运行.不过,我似乎更频繁地使用字段名称.例如,我有几种数据类型,不是由类型类相关但经常一起使用,它们包含颜色值,所以我希望每个数据类型都有一个名为"color"的字段.

经验丰富的Haskell开发人员如何命名,并将它们组织成模块,以避免这种情况?

Tra*_*own 9

GHC扩展-XDisambiguateRecordFields允许foo = Foo { value = 42 }(但不允许n = value foo).

关于Haskell当前记录系统的缺点和替换的候选者,以及一些试图提供更好解决方案的图书馆,有大量文献.fclabels是我个人使用的唯一一个.

此StackOverflow问题类似,其中的一些答案可能对您有用.

这实际上是不同模块中更一般的函数问题的特殊情况,这些函数具有相同的名称但在不同的不相关类型上运行.

合格的导入和别名通常足以解决此问题.