使用TemplateHaskell键入同义词

时间:2016-03-20 15:38:13

标签: haskell ghc template-haskell

如果我的类型MappingCodec经常(但不总是)第二个参数是第一个的(固定)函数,我可以写一个辅助函数data Foo = Foo Int Int来减少重复。

我有这个确切的问题,但是在类型级别。自然的解决方案可能是使用单例来推广mkFoo m = Foo m (f m),但我的f不容易被提升。相反,我正在尝试使用TemplateHaskell和反射来在编译时在数据级别评估f。例如,我目前可以执行此操作(使用f‑XDataKinds):

GHC.TypeLits

每次我想使用这种模式时,必须用具体的类型编写它,这显然很烦人。不幸的是,我知道没有更短或通用的方式来编写f :: Integer -> Integer data Bar (a::Nat) (b::Nat) mkNat :: Integer -> Q Type -- constructs a TypeLit bar :: Bar 5 $(mkNat $ f $ proxy natValue (Proxy::Proxy 5)) 的签名。特别是,我无法定义类型同义词

bar

由于TH阶段限制(在编译同义词时未导入或已知type Bar' (m :: Nat) = Bar m $(mkNat $ f $ proxy natVal (Proxy::Proxy m)) bar :: Bar' 5 )。

有没有办法简化m的签名?

0 个答案:

没有答案