我想在编译时找到有关类型构造函数的类型参数的角色的信息。幸运的是,Template Haskell提供了这样一个函数reifyRoles
。然而,当我在聚合物类型上使用它时,它给我奇怪的结果:
GHCi, version 8.2.1: http://www.haskell.org/ghc/ :? for help
Loaded GHCi configuration from /Users/alexis/.ghci
ghci> :set -XTemplateHaskell -XDeriveLift -XStandaloneDeriving
ghci> import Data.Proxy
ghci> import Language.Haskell.TH
ghci> import Language.Haskell.TH.Syntax
ghci> deriving instance Lift Role
ghci> $(lift =<< reifyRoles ''Proxy)
[NominalR,PhantomR]
奇怪的是,即使Proxy
只有一个类型参数,reifyRoles
也会生成一个包含两个元素的列表。这使得很难确定哪个角色对应于Proxy
的单一类型参数。
单声道类型不会发生这种情况:
ghci> data Foo a = Foo
ghci> $(lift =<< reifyRoles ''Foo)
[PhantomR]
从文档中不清楚reifyRoles
实际上在这里做了什么。我有两个相关的问题:
如果我只关心类型参数的角色,并且我不关心类型,我可以假设类型的角色将是列表中的 last ?如果没有,我如何为任意类型的类型参数正确选择正确的角色?
在种类的背景下,角色甚至意味着什么?给定Proxy
角色的nominal
类型参数为什么?