我正在使用syntactic库来制作AST。为了评估AST为(哈斯克尔)值,我所有的节点都需要是语法类EvalEnv
的一个实例:如何取消我的样板
class EvalEnv sym env where
compileSym :: proxy env -> sym sig -> DenotationM (Reader env) sig
句法还提供了一个“默认”的实现:
compileSymDefault :: (Eval sym, Signature sig)
=> proxy env -> sym sig -> DenotationM (Reader env) sig
但在sig
约束是在EvalEnv
情况下无法访问,进行以下(比如,重叠)的实例是不可能的:
instance EvalEnv sym env where
compileSym = compileSymDefault
所有我的用户自定义的AST节点GADTs,通常有多个构造,其中a
参数总是满足了compileSymDefault
约束:
data ADDITIVE a where
Add :: (Num a) => ADDITIVE (a :-> a :-> Full a)
Sub :: (Num a) => ADDITIVE (a :-> a :-> Full a)
结果,我发现我的实例是所有为EvalEnv
外观像:
instance EvalEnv ADDITIVE env where
compileSym p Add = compileSymDefault p Add
compileSym p Sub = compileSymDefault p Sub
这样板实例是所有AST节点相同,并且需要每个GADT构造的要被单独列出,作为GADT构造签名意味着compileSymDefault
限制。
有什么办法可以避免必须列出每个节点类型的每个构造函数吗?
无关,我不知道你应该将代理传递给'compileSym'。这不是必要的,并且使这个定义复杂化。 – Carl 2014-09-29 22:49:43
@Carl如果不清楚,'compileSymDefault'由语法库提供。那里可能有一些原因。 – crockeea 2014-09-30 00:12:08
“添加剂”类在哪里?我无法在任何“句法”模块中找到它,Hayoo也不能。 http://hayoo.fh-wedel.de/?query=syntactic+Additive – Cirdec 2014-09-30 03:16:05