2014-04-27 4 views
1

유형 A와 B가 선언 된 모듈 A와 모듈 B가 있다고합시다. 우리는 슈퍼는 다음 코드에서와 같은 A 또는 B 중 하나입니다 유형 말하고 싶은 슈퍼 모듈에서 :가져온 모듈의 유형으로 데이터 유형을 작성하십시오.

-- module A 
data A = A String 

-- module B 
data B = B Int 

-- module Super 
data Super = A.A 
      | B.B 

을하지만 우리는 데이터 생성자에서 전체 자격을 갖춘 데이터 유형을 사용할 수 없기 때문에이 작동하지 않습니다 (오류 입니다 : "위치 바인딩에 규정 된 이름") 우리는 아래와 같이 전체 지정의 이름을 넣어하지 않는 경우, A 형 및 B는하지 그 모듈 A와 B에서 있습니다

-- module Super 
data Super = A 
      | B 
는 지금까지 내 솔루션은 다음과 같이하는 것입니다

-- module Super 
data Super = A A.A 
      | B B.B 

더 좋은 방법이 있나요? I 타입 클래스를

시를 사용할 필요가 있는지 확실하지 않다 : 당신의 이름의 과도한 증식없이 멀리 얻을 수있는 경우 내 목표는

let mySuperList = [ B, A ] :: [Super] 

답변

4
let mySuperList = [ Left B, Right A ] :: [Either B A] 

슈퍼 유형의 목록을 할 수있다 장기적으로 보면 더 강력 할 것입니다.

+0

나는 할 수 없다. 더 많은 타입이 올 것이다. –

+3

@ Erèbe 그런 다음 자신의 타입을 정의한다. 데이터 Union = A A.A | B B.B | C C.C | D D.D | ... '하고 필요에 따라 확장하십시오. 이는 '이터'중첩 (즉, 어느 쪽이라도 (어느 쪽이라도 B (모두 C D))보다 훨씬 유용합니다. N 유형으로이 문제를 해결하는 방법을 다루는 [데이터 유형 알라 카르테] (http://www.cs.ru.nl/~W.Swierstra/Publications/DataTypesALaCarte.pdf) 보고서를 검토 할 수도 있습니다 ,이 방법에는 몇 가지 중요한 이론과 계산 오버 헤드가 있음을 명심 하긴하지만. – bheklilr

+0

나는 그 종이를 읽을 것이다. Merci bien à toi –

관련 문제