展开类型同义词,使用GHCi键入族

mgi*_*son 21 haskell ghci type-families

我想知道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
Run Code Online (Sandbox Code Playgroud)

那么我希望能够在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)))) 
Run Code Online (Sandbox Code Playgroud)

据我所知,GHCi实际上并没有像:texpand命令那样提供任何东西,而且我不确定它是否仍然是该信息的最佳界面.但是,似乎可以以某种方式从GHC中提取扩展类型,我真的希望能够以交互方式看到它们.

黑客,文档链接,关于GHCi未来增加的推测性讨论都受到欢迎.

sha*_*haf 22

: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)))
Run Code Online (Sandbox Code Playgroud)

(为方便起见,你可以把类似的东西:def k! \x -> return (":kind! " ++ x)在你的.ghci.)

  • 这在GHC 8.0.2中对我不起作用.它只是按原样打印出类型别名,没有任何扩展. (4认同)