2012-11-28 10 views
16

GHCi (또는 다른 곳)에 존재하는 기능이 임의의 유형 표현식에서 유형 동의어 및 계열을 확장하는지 궁금합니다. 예를 들어유형 동의어를 확장하고 GHCi로 유형을 입력하십시오.

, 나는 이러한 유형의 경우,

data A = A 
data B = B 

data F a = F a 
data G a = G a 
data H a b = H a b 

type S a b = H (F a) (G b) 
type T a = S (a) (H B a) 

type family R a :: * 
type instance R (H a b) = H b a 

그때 나는 ghci 세션에서 출력의이 종류를 얻을 수 있도록하고 싶습니다.

> :t undefined :: T (S B A) 
undefined :: T (S B A) :: T (S B A) 

> :texpand undefined :: T (S B A) 
undefined :: T (S B A) :: H (F ((H (F B) (G A)))) (G (H B (H (F B) (G A)))) 

> :texpand undefined :: R (T (S B A)) 
undefined :: R (T (S B A)) :: H (G (H B (H (F B) (G A)))) (F ((H (F B) (G A)))) 

는 지금까지 내가 말할 수있는, GHCi 실제로 :texpand 명령 같은 것을 제공하지 않습니다, 나는 어쨌든 그 정보에 가장 적합한 인터페이스 될 것이라고 모르겠어요. 그러나 확장형은 GHC에서 어떻게 든 추출 할 수 있으며 대화식으로 볼 수 있기를 정말로 원합니다.

GHCi의 향후 추가에 대한 해킹, 문서 링크, 투기 적 토론 모두 환영합니다.

답변

17

:kind! 그 작업을 수행합니다

λ> :kind! T (S B A) 
T (S B A) :: * 
= H (F (H (F B) (G A))) (G (H B (H (F B) (G A)))) 
λ> :kind! R (T (S B A)) 
R (T (S B A)) :: * 
= H (G (H B (H (F B) (G A)))) (F (H (F B) (G A))) 

(편의를 위해, 당신은 당신의 .ghci:def k! \x -> return (":kind! " ++ x) 뭔가를 넣을 수 있습니다.)이 GHC의 7.something의 새로운 것을 언급 할 가치가

+0

. (4 또는 6, 잊어 버림) –

+3

GHC 8.0.2에서는 나에게 적합하지 않습니다. 어떤 확장도없이 형식 별칭을 그대로 인쇄합니다. – Hjulle

+0

GHC 8.2.1과 동일한 문제가 있습니다. –