2012-12-08 7 views
-1

유형 변수가 포함 된 유형이 주어지면 유형 변수가 반복되지 않는 무한한 유형 변수 목록을 정의하는 방법이 있습니까?유형 변수의 무한한 목록 - 유형 유추

내 질문에 대한 자세한 내용을 알려주십시오. 저는 하스켈에서 타입에 대한 추론을하고 있습니다. 내 데이터 유형은 다음과 같습니다.

data Ty = TyUnit 
     | TyVar String 
     | TyBool 
     | TyInt 
     | TyBoolList 
     | TyIntList 
     | Arrow Ty Ty 

위 유형의 정의를 보았습니다. 이 함수는 무한한 변수 이름 목록을 생성한다고 가정합니다. 나는 진행 방법 및 질문의 실제 구현에 혼란 스러울뿐입니다.

+0

가능한 모든 조합이 사용되고 반복되지 않도록 Ty 객체 목록을 의미합니까? –

+1

잠재적 인 비 종결 brute-force 접근법 외에도 유형 추정기를 구축 할 때 이것이 필요한지 확실하지 않습니다. 내가 이해할 때, 보통'freshTyVars = map (TyVar. ("_fresh _"++). show) [0 ..]'또는 실제로''FreshVars = [String]'을 타이핑하고 이것을 TyVar 's. –

답변

1

여기 있습니다.

allTys 0 = TyUnit : TyVar "?" : TyBool : TyInt : TyBoolList : TyIntList : [] 
allTys n = [0..n-1] >>= (\i -> liftM2 Arrow (allTys i) (allTys (n-1-i))) 

allTypes = [0..] >>= allTys 

allTys n

높이 n의 형 트리를 구성한다. 여기서 높이는 Arrow x y이고 높이는 x + 높이 y + 1이고 높이는 0입니다. 구조는 매우 기본입니다. 더 빨리 할 수 ​​있을지 확신 할 수 없습니다. 더 설명이 필요한 경우 의견에 질문하십시오.

또한, 필요한 경우 알파벳의 모든 문자열을 가져 오는 방법입니다 (예 : ['a'..'z']).

strings alphabet = (:) [] $ liftM2 (flip (:)) (strings alphabet) alphabet 

긴 문자열은 somechar:shortstring입니다. 빈 문자열이 포함됩니다.

+0

-1 :이 질문은 형식 변수의 무한한 목록을 묻습니다. 그래서 이것은 해결책이 아닙니다. –

+0

@cebewee, 그는 TyVar의 목록 만 원했을 것이라고 생각합니까? "FreshTyVars는 반복되지 않는 유형의 무한한 목록을 생성해야합니다. 즉, 중첩 된 Arrow 문이 무한한 경우가 될 수 있음을 의미합니다"라는 대답을 썼습니다. –

+0

Juodele : 질문은 "FreshVars = [Ty] 유형이 주어지면 유형 변수가 반복되지 않는 무한한 유형 변수 목록을 정의하는 방법이 있습니까?" 하지만 당신은 옳습니다, 나중에 그는 일반적인 유형에 관해 이야기합니다. 나는 (- 1) (이것은 그가 원하는 것이 아니라고 생각하지만) un - would,하지만 나의 투표는 지금 잠겨있다. –