扩展GHCi中的类型同义词和类型族

25

我想知道是否有在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未来添加的推测性讨论。
1个回答

25

: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.x 版本以来的新功能。(我忘记是4还是6了) - Ben Millwood
6
在 GHC 8.0.2 中,这对我没有效果。它只是原样打印类型别名,没有任何展开。 - Hjulle
我在使用 GHC 8.2.1 时遇到了同样的问题。 - Sean Seefried
1
它已经可以在 GHC 9.2.1 上正常工作了。请参阅发布说明 - Noughtmare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接