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/