所以,我发现自己做了这样的事情:
newtype T x = T x deriving (Eq, Ord, ...)
我认为这很烦人,所以我正在考虑使用Template Haskell创建一个包,它将所有实例添加到base。
也许它甚至可以比仅处理上述内容更灵活。
首先,似乎模板Haskell只能吐出声明,所以我想我想使用独立的派生。一般来说,我想我想要生成这样的声明:
deriving instance (F x1, F x2, ... , F xn) => T x1 x2 x3
F
替换为Eq
,Ord
等等。
但右手边可能有点复杂,例如:
deriving instance (F x1, F x2, ... , F xn) => T x1 (Maybe x2) x3
或者甚至可能
deriving instance (F x1, F x2, ... , F xn) => T x1 (T2 x2 x3)
你甚至可以重复:
deriving instance F x => T x x
让我们暂时简化一下,并假设左边只有一个参数。所以我们正在研究这样的例子:
deriving instance F x => T (some stuff involving x)
我认为我需要的是如下函数:
(Name -> Type) -> Q [Dec]
然后我将每个班级列在一个列表中(即Eq
,Ord
等)。然后,对于该列表的每个类,我创建一个虚拟变量,在=>
的左侧将类应用于它,并将其传递给传递的Name -> Type
参数以获得右侧=>
的。{我可以吐出来作为拼接。
我想我可以为上面的函数做模板Haskell,但问题是,用户如何使用Template Haskell函数?
我觉得\x -> [| UserT x x |]
之类的东西不起作用,不是吗?
我希望用户能够执行以下操作:
data A t = A t (Maybe t)
deriveClasses (\x -> A x)
我怎样才能让最终用户感觉良好?我希望这个问题有某种意义,我目前最关注的是一个易于用户使用的表单。当谈到模板Haskell的实际编写时,我想我应该能够处理它。