我正在使用syntactic库来创建AST。要将AST评估为(Haskell)值,我所有的节点都需要成为syntactic类
Syntactic还提供了一个“默认”的实现:
EvalEnv
的实例:class EvalEnv sym env where
compileSym :: proxy env -> sym sig -> DenotationM (Reader env) sig
Syntactic还提供了一个“默认”的实现:
compileSymDefault :: (Eval sym, Signature sig)
=> proxy env -> sym sig -> DenotationM (Reader env) sig
但是在EvalEnv
实例中无法访问对sig
的约束条件,这使得下面的(例如重叠的)实例变得不可能:
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
。这并非必要,并且会使定义复杂化。 - CarlcompileSymDefault
是由语法库提供的。可能有一些原因在那里。 - crockeeaAdditive
在哪里?我在任何syntax
模块中都找不到它,Hayoo也是如此。http://hayoo.fh-wedel.de/?query=syntactic+Additive - Cirdec