使用模板Haskell的reifyRoles与多重数据类型?

时间:2017-11-01 21:46:30

标签: haskell template-haskell

我想在编译时找到有关类型构造函数的类型参数的角色的信息。幸运的是,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实际上在这里做了什么。我有两个相关的问题:

  1. 如果我只关心类型参数的角色,并且我不关心类型,我可以假设类型的角色将是列表中的 last ?如果没有,我如何为任意类型的类型参数正确选择正确的角色?

  2. 在种类的背景下,角色甚至意味着什么?给定Proxy角色的nominal类型参数为什么?

0 个答案:

没有答案