Haskell Can';不要让消歧记录字段工作

Haskell Can';不要让消歧记录字段工作,haskell,ghc,ghci,Haskell,Ghc,Ghci,我正在尝试使用消歧记录字段来允许我在不同的记录中使用相同的字段名,但我无法让它工作。例如: --文件A.hs {-# LANGUAGE DisambiguateRecordFields #-} module A where data ARec = ARec {nID :: Int, sDesc :: String} --文件B.hs {-# LANGUAGE DisambiguateRecordFields #-} module B where data BRec = BRec {nI

我正在尝试使用消歧记录字段来允许我在不同的记录中使用相同的字段名,但我无法让它工作。例如:

--文件A.hs

{-# LANGUAGE DisambiguateRecordFields #-}

module A where

data ARec = ARec {nID :: Int, sDesc :: String}
--文件B.hs

{-# LANGUAGE DisambiguateRecordFields #-}

module B where

data BRec = BRec {nID :: Int, sProdCode :: String}
--文件Main.hs

{-# LANGUAGE DisambiguateRecordFields #-}

module Main where

import A

import B

zA = ARec 123 "Happy"

zB = BRec 456 "Usually"

main = putStrLn $ "zA's ID is " ++ show (nID zA)
如果我写上述三个文件并:将Main加载到GHCi,它会抱怨nID上的冲突。我认为这正是消除歧义科尔菲尔德的设计目的

任何帮助都将不胜感激


谢谢你,伊恩。

消歧记录字段只适用于某些情况,而其他字段仍然不明确(或者至少被认为不明确,即使有时事实并非如此)。具体请参见示例中的“bad2”。

顺便说一句,
消歧记录字段
仅在从其他模块导入时起作用,这是正确的。因此,可以轻松地重新导入限定的字段名,并在编译器出现故障时使用它

{-# LANGUAGE DisambiguateRecordFields #-}

module Main where
import A
import B
import qualified A as A(nID)

zA = ARec 123 "Happy"
zB = BRec 456 "Usually"

main = putStrLn $ "zA's ID is " ++ show (A.nID zA)

其他事件留给编译器处理。

谢谢你的回答,但我看不出有什么关联。在我的代码中,通过使用构造函数,zA被明确地类型化为ARec。在bad2中,k是真正模棱两可的。顺便说一句,即使我添加了显式类型声明zA::ARec和zB::BRec.True,问题仍然存在,但括号中的部分仍然被认为是不明确的<代码>消歧记录字段
无法处理这种情况。不过,有一些关于进一步延长的建议可能有助于解决剩余的案件:谢谢chirlu。我想你说的是,这是一个限制,在任何情况下都是对基础语言的扩展。我想我很失望,这个扩展做得太少了;我认为这对我的工作毫无帮助。哦,好吧,我最好把我的字段名标准化!