haskell - Haskell 记录中的名称冲突

标签 haskell

Haskell 没有记录成员的点符号。对于每个记录成员,编译器创建一个具有相同名称且类型为 RecType -> FieldType 的函数。这会导致名称冲突。有什么办法可以解决这个问题,即我怎样才能有多个具有相同字段名称的记录?

最佳答案

对于大型项目,我更喜欢将每种类型保留在自己的模块中,并使用 Haskell 的模块系统来命名每种类型的访问器。

例如,我可能有一些类型 A在模块 A :

-- A.hs

data A = A
    { field1 :: String
    , field2 :: Double
    }

...和另一种类型B在模块 B 中具有类似名称的字段:
-- B.hs

data B = B
    { field1 :: Char
    , field2 :: Int
    }

然后,如果我想在其他模块中使用这两种类型 C我可以导入它们,以区分我的意思是哪个访问器:
-- C.hs
import A as A
import B as B

f :: A -> B -> (Double, Int)
f a b = (A.field2 a, B.field2 b)

不幸的是,Haskell 没有办法在同一个模块中定义多个命名空间,否则就不需要将每个类型拆分到一个单独的模块中来执行此操作。

关于haskell - Haskell 记录中的名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17478599/

相关文章:

haskell - 同态中的森林砍伐

haskell - 将类型级别列表转换为值

Haskell 映射函数和 lambda 表达式

haskell - 在实践中使用单子(monad)、幺半群、仿函数和箭头

haskell - 异构列表的显示实例

haskell - 如何使用 random-fu (Haskell) 从正态分布生成 n 个随机数?

Haskell 不在范围内 : Type constructor or class `PushInt'

haskell - 这个双仿函数子集有名字吗?

haskell - 将部门信息隐藏在额外部门链中

haskell - 高阶函数和 id