如果我的类型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
的签名?