2013-08-12 2 views
2

여기 내 간단한 코드 : 내 유형이 상호 정의를 필요로하지 않는다 "와"때문에이 경우에는 내가하지만,에, 필요하지 않은 것을 알고타입 생성자는 아직 완전히 정의되지 않은

type t1 = [ `A of t2] 
and t2 = [ `B | t1 ] 

내가 필요한 현실 세계. 왜 작동하지 않습니까? 나는

and t2 = [`B | `C of t1] 

을 수행하여 작동 할 수 있지만 지금은 내 다형성 변종의 모든 관심을 잃고 난 그냥 보통의 변종으로 전환 할 수 있습니다.

내가 할 수있는 방법이 있습니까?

답변

2

t2의 정의에서이 시점에서 완전히 정의되지 않은 유형 t1을 "확장"하려고합니다 ('분기'에서 requre t2로).

재귀 일반 데이터 형식을 "에뮬레이션"(하지만 다형성 변형을 대신 사용)하려면 데이터 생성자에서 상호 재귀 유형에 대한 모든 참조를 사용해야합니다. 이 경우
귀하의 예는 다음과 같이 보일 수 있습니다 :

type t1 = [ `A of t2 ] 
and t2 = [ `B | `C of t1 ] 

참고 또한을 OCaml의 건설 [`B에서 | t1]은 이 아니며은 다른 행과 함께 다형성 행을 확장하는 것을 의미합니다. 단지 유형 동의어 대체 일뿐입니다.

+0

나는 그것이 내 질문에 그것을 썼습니다. :) 나는 타입을 확장하고 동의어를 갖는 것의 차이를 이해하지 못합니다. ocaml에 어떤 차이도없는 것처럼 보입니다. –

+0

그리고 나는 왜 그것이 C없이 작동하는지 이해하지 못합니다. –

+1

@double_squeeze이 경우 컴파일러에서 기대하는 바가 있습니까? Ocaml은 [A | B | A의 [B | A 중 ...]]]이 오류가 무한합니다. 'C와 함께하면 [A | B | C의 'a]는'a '로 완벽하게 괜찮습니다. –

관련 문제