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)

上記の 3 つのファイルと :load 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 に答える