我正在尝试使用DisambiguateRecordFields来允许我在不同的记录中使用相同的字段名称,但我无法让它工作。例如:
- 文件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上的冲突。我认为这正是DisambiguateRecordFields旨在克服的目标。
任何帮助将不胜感激!
谢谢,伊恩。
答案 0 :(得分:0)
DisambiguateRecordFields
仅适用于某些情况,而其他情况仍然含糊不清(或至少被认为是含糊不清的,即使有时并非如此)。请参阅the relevant documentation,特别是“bad2”。
答案 1 :(得分:0)
顺便说一下,DisambiguateRecordFields
仅在从其他模块导入时才有效,正如您所做的那样。因此,可以轻松地重新导入限定的字段名称,并在编译器失败的地方使用它
{-# 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)
其他事件留给编译器。