2012-11-28 11 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と同じ問題があります –

関連する問題