2016-07-14 1 views
2

모듈 A와 B 모두 Event 유형을 내보내고 있습니다. 모듈 C는 모듈 A의 Event에 대한 동의어를 정의하고이를 InputEvent이라고합니다.ViewPatterns GHC 확장을 사용하지 않고 타입 동의어의 데이터 생성자를 가져올 수 있습니까?

내가 다음 모듈 D의 두 모듈 B와 모듈 C 소모 : 나는 InputEvent의 타입 생성자를 (예를 들어, MakeEvent)를 가져 오려고 할 경우, 그러나

module D where 

import B (Event) 
import C (InputEvent) 

를, 나는 오류가 발생합니다 :

Module 
‘C’ 
does not export 
‘InputEvent(MakeEvent)’ 

이것은 ViewPatterns GHC 확장을 이용하여 C 모듈로부터 MakeEvent 별칭 수출 의해 해결 될 수있다 :

makeEvent = MakeEvent 

그러나 ViewPatterns 확장명을 사용하지 않고 MakeEvent 데이터 생성자를 가져 오는 방법이 있습니까?

+0

유형 동의어에는 생성자가 없으므로 자연스럽게 유형 동의어의 생성자를 가져 오지 못합니다. 모듈을 export하는 모듈로부터 생성자를 import한다 : import {B/C} (Event (MakeEvent))'. 패턴 syn은 실제로 여기서 도움이되지 않을 것입니다 -'MakeEvent' 생성자는'MakeEvent' 패턴과 충돌합니다. 따라서 당신은 그것들을 정규화 된 것으로 가져와야 할 것입니다. 게다가, 당신은 그런 별명을 필요로하지 않는다. 단순히 모듈'C'에서'MakeEvent'를 다시 내 보낸다. – user2407038

+0

관련 : http://stackoverflow.com/questions/35616041/can-i-export-constructors-along-with-a-type-alias –

답변

2

유형 동의어를 사용하여 추상화 장벽을 적용하지 마십시오. 작은 개인용 문자는 제외합니다. 그들은 잘하지 못합니다. Event을 숨기려면 newtype 및 패턴 동의어를 사용하십시오.

+0

나는 '이벤트'를 숨기고 싶지 않습니다. 모듈 C는 모듈 A와 B를 상호 운용 할 수 있도록 편의상 (즉, 정규화 된 가져 오기를 사용할 필요가 없도록) 다시 내보내기합니다. 형식 생성자를 내 보내지 않고 모듈 D에서 모호한 참조가 발생할 수 없다는 점을 제외하고는 모듈 A에서 데이터 생성자 만 내보내는 것이 행복 할 것입니다. 가장 좋은 방법은 형식 별칭을 스크랩하고 정규화 된 가져 오기를 사용하는 것입니다. –

+0

@CameronMartin, 나에게 좋은 계획 같아. 당신이 자격을 갖춘 타입을 가져올 수 있지만 그것의 생성자는 자격이 없다면 좋을 것입니다. 그대로두면 로컬 양방향 패턴 동의어와 함께 정규 가져 오기가 될 수 있습니다. – dfeuer