为代数数据类型定义TH Lift实例

Dav*_*vid 7 haskell template-haskell

假设我有一个带有多个构造函数的代数数据类型,比如

data Animal a = Mouse a | Beaver a | Rabbit a
Run Code Online (Sandbox Code Playgroud)

我如何Lift有效地创建实例?最简单的方法是

instance (Lift a) => Lift (Animal a) where
      lift (Mouse  x) = [| Mouse  x |]
      lift (Beaver x) = [| Beaver x |]
      lift (Rabbit x) = [| Rabbit x |]
Run Code Online (Sandbox Code Playgroud)

但这非常多余.当然,我不能直接抽象出不同的动物lift x = [| x |],尽管概念上它与我想要实现的相似.有没有办法在TH中执行此操作,以便我不必为每个数据构造函数再次编写相同的行?

scl*_*clv 4

这就是 th-lift 包的目的,它恰好提供了此功能:http ://hackage.haskell.org/package/th-lift