无法使DisambiguateRecordFields正常工作

时间:2013-07-17 17:03:38

标签: haskell ghc ghci

我正在尝试使用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旨在克服的目标。

任何帮助将不胜感激!

谢谢,伊恩。

2 个答案:

答案 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)

其他事件留给编译器。