使用模板Haskell获取关联的types同义词

Can Template Haskell可以找出types类中声明的关联types同义词的名称和/或声明吗? 我期望reify会做我想做的,但是似乎并没有提供所有必要的信息。 它适用于获取函数types签名:

 % ghci GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help ... Prelude> -- I'll be inserting line breaks and whitespace for clarity Prelude> -- in all GHCi output. Prelude> :set -XTemplateHaskell Prelude> import Language.Haskell.TH Prelude Language.Haskell.TH> class C a where f :: a -> Int Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''C) ClassI (ClassD [] Ghci1.C [PlainTV a_1627398388] [] [SigD Ghci1.f (ForallT [PlainTV a_1627398388] [ClassP Ghci1.C [VarT a_1627398388]] (AppT (AppT ArrowT (VarT a_1627398388)) (ConT GHC.Types.Int)))]) [] 

但是,向类中添加关联types同义词不会导致输出中的更改(重命名):

 Prelude Language.Haskell.TH> :set -XTypeFamilies Prelude Language.Haskell.TH> class C' a where type F a :: * ; f' :: a -> Int Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''C') ClassI (ClassD [] Ghci3.C' [PlainTV a_1627405973] [] [SigD Ghci3.f' (ForallT [PlainTV a_1627405973] [ClassP Ghci3.C' [VarT a_1627405973]] (AppT (AppT ArrowT (VarT a_1627405973)) (ConT GHC.Types.Int)))]) [] 

如果我知道F的名字,我可以查询它的信息:

 Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''F) FamilyI (FamilyD TypeFam Ghci3.F [PlainTV a_1627405973] (Just StarT)) [] 

但是我首先找不到F的名字。 即使我添加了一个types的InstanceDInstanceD也没有关于这个定义的信息:

 Prelude Language.Haskell.TH> instance C' [a] where type F [a] = a ; f' = length Prelude Language.Haskell.TH> f' "Haskell" 7 Prelude Language.Haskell.TH> 42 :: F [Integer] 42 Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''C') ClassI (ClassD [] Ghci3.C' [PlainTV a_1627405973] [] [SigD Ghci3.f' (ForallT [PlainTV a_1627405973] [ClassP Ghci3.C' [VarT a_1627405973]] (AppT (AppT ArrowT (VarT a_1627405973)) (ConT GHC.Types.Int)))]) [InstanceD [] (AppT (ConT Ghci3.C') (AppT ListT (VarT a_1627406161))) []] 

如果reify不起作用,是否有解决方法,除了手动列出关联types同义词?

在GHC 7.8.3中使用template-haskell包的版本2.9.0.0存在这个问题; 它也出现在GHC 7.4.2中,模板-haskell包的版本为2.7.0.0。 (我没有检查GHC 7.6。*,但是我想它也出现在那里)。我对GHC的任何版本的解决scheme感兴趣(包括“这只在GHC版本V中固定”)。

它没有被执行,因为没有人要求。

奇怪的是,TH使用自己的AST,它不遵循内部编译器的AST。 因此,任何新function(例如关联types族)都不能通过TH自动获得。 有人必须打开票并实施。

对于引用:内部reifyClass函数会忽略关联的types系列(它是classExtraBigSig返回的元组的第5个元素,另请参阅ClassATItem定义。

从技术上讲,在reify实现关联types系列支持应该很容易,但是很可能在TH API中需要后向不兼容的更改,例如,因为它的AST似乎不支持关联types默认值。

补充:现在已经实现了 (没有API改变btw),并可能在下一个ghc版本中可用。