Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 展开类型同义词,使用GHCi键入族_Haskell_Ghci_Type Families - Fatal编程技术网

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

Haskell 展开类型同义词,使用GHCi键入族,haskell,ghci,type-families,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 然后我希望能够在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未来添加内容的推测性讨论。

: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。(4或6,我忘了)这在GHC 8.0.2中对我不起作用。它只是按原样打印类型别名,没有任何扩展