假设我有一个带有多个构造函数的代数数据类型,比如
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中执行此操作,以便我不必为每个数据构造函数再次编写相同的行?