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

时间:2013-03-21 11:56:35

标签: haskell template-haskell

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

data Animal a = Mouse a | Beaver a | Rabbit a

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

instance (Lift a) => Lift (Animal a) where
      lift (Mouse  x) = [| Mouse  x |]
      lift (Beaver x) = [| Beaver x |]
      lift (Rabbit x) = [| Rabbit x |]

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

1 个答案:

答案 0 :(得分:4)

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

相关问题