我正在使用Data.Typeable,特别是我希望能够生成正确类型的特定种类(如*
)。我快到的问题是,TypeRep允许我们做如下(以GHC与7.8版本的工作):是否有可能在Haskell中获得类型构造函数的种类?
let maybeType = typeRep (Proxy :: Proxy Maybe)
let maybeCon = fst (splitTyConApp maybeType)
let badType = mkTyConApp maybeCon [maybeType]
这里badType
是在某种意义上类型的表示也许也许,这是任何类型的不是有效的类型:
> :k Maybe (Maybe)
<interactive>:1:8:
Expecting one more argument to ‘Maybe’
The first argument of ‘Maybe’ should have kind ‘*’,
but ‘Maybe’ has kind ‘* -> *’
In a type in a GHCi command: Maybe (Maybe)
我不是在寻找在类型级别执行这一点,但我希望能够写一个程序,它是足够聪明,避免在运行时构建这样的类型。我可以使用TypeRep
的数据级别来执行此操作。理想情况下,我会像
data KindRep = Star | KFun KindRep KindRep
,并有一个函数kindOf
与kindOf Int = Star
(大概真的kindOf (Proxy :: Proxy Int) = Star
)和kindOf Maybe = KFun Star Star
,这样我就可以“种核对”我TypeRep值。
我想我可以用像Typeable
这样的多色类型类型手动执行此操作,但我宁愿不必为所有内容编写自己的实例。我还希望不要恢复到GHC 7.6,并使用不同类型的Typeable类型有单独的类型类的事实。我接受从GHC获取这些信息的方法。
'typeOf1'和'Typeable1'(和朋友)仍然从'Data.Typeable'输出......它们在7.8中可用。 – 2014-10-10 05:58:31