2017-02-28 1 views
3

는 다음이 허용됩니다 :내보내기 중복 레코드 필드 <code>-XDuplicateRecordFields</code>와

{-# LANGUAGE DuplicateRecordFields #-} 

module Baz(Foo(..), Bar(..)) where 
import Foo (Foo(..)) 
import Bar (Bar(..)) 
: Foo이 모듈 Bar에 정의 된 모듈 FooBar에 정의 될 때

{-# LANGUAGE DuplicateRecordFields #-} 

module Baz(Foo(..), Bar(..)) where 
data Foo = Foo {qux :: Int}  
data Bar = Bar {qux :: String} 

그러나, 내가 컴파일 오류가

Conflicting exports for ‘qux’

나는 무엇을 하려는지 equiv 첫 번째 예를 들었다. 데이터 유형이 원래 정의 된 위치는 중요하지 않습니다. GHC 8에서 지원되는 것입니까?

+2

이 잘 버그 수 있습니다, 당신은 [보고해야한다 (https://ghc.haskell.org/trac/ghc/wiki/ReportABug). –

+1

이것은 구현의 한계 일 수 있습니다. 동일한 모듈에서 두 개의 동일한 이름의 필드를 정의하기 때문에 일반적으로이 확장이 필요합니다. 다른 모듈에서 그렇게하는 것은 이미 자격이있는 가져 오기를 사용하여 명확 해지기 때문에 이미 OK입니다. 아마도 위와 같은 다른 경우는 GHC 개발자가 고려하지 않았을 것입니다. – chi

답변

0

나는 here 버그를 게시 했어. 그러나 우연히도 회피 방법을 발견했습니다.

Foo.hs 또는 Bar.hs라는 플러그 인을 넣으면 GHC에서 프로그램을 허용합니다. 즉, 다음과 같은 컴파일입니다 :

{-# LANGUAGE DuplicateRecordFields #-} 
module Foo(Foo(..)) where 
data Foo = Foo {qux::Int} 

module Bar(Bar(..)) where 
data Bar = Bar {qux::String} 

module Baz(Foo(..),Bar(..)) where 
import Foo (Foo(..)) 
import Bar (Bar(..))