假设我有一个具有多个构造函数的代数数据类型,例如
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 中这样做,这样我就不必为每个数据构造函数再次编写同一行?