使用Template Haskell派生类

时间:2017-09-10 13:30:12

标签: haskell template-haskell

所以,我发现自己做了这样的事情:

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替换为EqOrd等等。

但右手边可能有点复杂,例如:

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]

然后我将每个班级列在一个列表中(即EqOrd等)。然后,对于该列表的每个类,我创建一个虚拟变量,在=>的左侧将类应用于它,并将其传递给传递的Name -> Type参数以获得右侧=>的。{我可以吐出来作为拼接。

我想我可以为上面的函数做模板Haskell,但问题是,用户如何使用Template Haskell函数?

我觉得\x -> [| UserT x x |]之类的东西不起作用,不是吗?

我希望用户能够执行以下操作:

data A t = A t (Maybe t)

deriveClasses (\x -> A x) 

我怎样才能让最终用户感觉良好?我希望这个问题有某种意义,我目前最关注的是一个易于用户使用的表单。当谈到模板Haskell的实际编写时,我想我应该能够处理它。

0 个答案:

没有答案