1

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

任何帮助,将不胜感激!

谢谢,伊恩。

4

2 回答 2

0

DisambiguateRecordFields仅适用于某些情况,而其他情况仍然模棱两可(或至少被认为模棱两可,即使有时实际上并非如此)。请参阅相关文档,特别是那里的示例中的“bad2”。

于 2013-07-17T18:56:17.020 回答
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)

其他事件留给编译器。

于 2016-04-14T11:27:34.333 回答