如何为 Template Haskell 拼接编写属性测试?

dfe*_*uer 12 haskell template-haskell

我总是喜欢能够为我的代码编写属性测试。当该代码是 Template Haskell 时,我最感兴趣的是生成的代码的行为。直觉上,我希望能够写出类似的东西

import Test.QuickCheck

checkLift :: (Eq a, Lift a, Show a) => a -> Property
checkLift a = $$(liftTyped a) === a

prop_myLiftWorks :: MyType -> Property
prop_myLiftWorks = checkLift
Run Code Online (Sandbox Code Playgroud)

不幸的是,Template Haskell 阶段的限制使得这种精确的方法完全不可能。生成的拼接必须单独编译才能运行。是否有一些简单的方法可以在测试套件中启动 GHC 实例(或对包执行某些操作ghchaskell-language-server?)并对其进行拼接?

理想情况下,我希望能够使用声明拼接和表达式拼接。例如,要为 编写属性测试deriving-compat,我想要生成各种类型的任意数据类型声明,然后将 Template Haskell 派生的实例与 GHC 派生的实例进行比较。