gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:46:46 25 4
gpt4 key购买 nike

从各种 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

value 的无限制引用在模块 Three即使两个导入的名称中只有一个在这种情况下有意义,也被认为是模棱两可的。 (在 OO 语言中,对 foo.valuebar.value 的引用是明确的。)

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

这实际上是不同模块中具有相同名称但在不同、不相关类型上运行的函数的更普遍问题的特殊情况。不过,我似乎更经常遇到字段名称。例如,我有几个数据类型,与类型类无关,但经常一起使用,它们包含颜色值,所以我希望每个数据类型都有一个名为“颜色”的字段。

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

最佳答案

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

有一个large body of literature关于 Haskell 当前记录系统的缺点和替代它的候选者,以及少数试图提供更好解决方案的图书馆。 fclabels 是我个人使用过的唯一一个。

This StackOverflow question是相似的,其中的一些答案也可能对您有用。

This is really a special case of the more general issue of functions in different modules that have the same name but operate on different, unrelated types.



Qualified imports和别名通常足以解决这个问题。

关于haskell - Haskell中不同数据类型的字段标签之间的名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3277840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com