7

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

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 中这样做,这样我就不必为每个数据构造函数再次编写同一行?

4

1 回答 1

4

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

于 2013-03-21T17:04:48.140 回答