24

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への将来の追加に関する投機的な議論はすべて歓迎します。

4

1 に答える 1

24

: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)))

(便宜上、のようなものを入れることができ:def k! \x -> return (":kind! " ++ x)ます.ghci。)

于 2012-11-28T03:12:28.120 に答える