2012-08-24 2 views
5

내 통제하에 있지 않은 라이브러리 모듈 Foo이 가정 기능 :제어 문서화 유형 서명 재수출

module Foo (Foo, thing) where 
data Foo = Foo Int 
thing :: Foo 
thing = Foo 3 

지금 나는 Foo에서 thing을-수출 다시 내 자신의 라이브러리 모듈을 가지고 가정이 기준 치수. 호환성을 위해

module Bar (Foo.thing, getBar) where 
import qualified Foo 
type Bar = Foo.Foo 
getBar :: Bar -> Int 
getBar (Foo i) = i 

, 내가하지 다른 thing을 내보낼 않습니다. Foo.thing을 내보내므로 사용자가 FooBar 모듈을 모두 가져 오는 경우 해당 코드는 thing이되며 이름 충돌은 발생하지 않습니다.

이제 우리는 Bar을 사용하는 세 번째 모듈이 있다고 가정합니다.

module Main where 
import Bar 

세 번째를 ghci에로드합시다. 대신 ghci 및 모듈 BarthingFoo.Foo을 입력되었음을 나타내는 haddocks의

[1 of 3] Compiling Foo    (Foo.hs, interpreted) 
[2 of 3] Compiling Bar    (Bar.hs, interpreted) 
[3 of 3] Compiling Main    (test.hs, interpreted) 
Ok, modules loaded: Main, Bar, Foo. 
ghci> :t thing 
thing :: Foo.Foo 
ghci> :t getBar 
getBar :: Bar -> Int 
ghci> getBar thing 
3 
ghci> :info Bar 
type Bar = Foo.Foo -- Defined at Bar.hs:3:6-8 

, 나는 그것이 thingBar을 입력 가지고 있음을 명시하고 싶습니다. 다른 thing을 내보내지 않고이 문제를 해결할 수있는 방법이 있습니까?

+0

잠깐, 사용자가 두 모듈을 모두 가져 오면 충돌이 없습니까? –

+0

@GabrielGonzalez 세 번째 파일에'import Foo'를 추가하고 직접보십시오! (둘 다 같은 *'물건 '을 수출하기 때문에 충돌이 없습니다.) 둘 다 수입 될 경우 ghci에게'Foo '보다'바'를 선호한다고 말할 것입니다. –

+0

와우! 이 기능을 사용할 수있는 기간은 얼마입니까?!?! 이것은 모든 것을 바꿉니다. –

답변

0

반대로 증거를 듣지 않는 한 대답은 다음과 같습니다. 수 없습니다.