如何用Haskell Monad的do notation正确构建抽象语法树(AST)
用Haskell Monad Do记法构建AST的实践与问题
我最近在尝试用Haskell的Monad do记法来定义抽象语法树(AST),参考了Text.Blaze.Html构建HTML树的思路,写了个示例代码:
ast = do Variable uint8 "i" Function Void "f" $ do Variable uint8 "local_y" Comment "etc. etc."
目前我已经有一个能运行但存在不少缺陷的实现,包含变量、函数、注释、占位符等节点,但遇到了几个核心问题:
- 搞不懂
TreeM a类型中参数a的具体含义; - 对
TreeM类型里Append构造器的存在量词使用、参数顺序存疑; - 当前实现的
Functor、Applicative实例并不适配AST,实际只用到了Monad的>>操作,我怀疑Free Monad才是更合适的方案; - AST变换函数
sub存在编译错误,无法正确处理Append节点的占位符替换; - 不清楚如何为AST实现正确的
fmap,进而适配Free Monad。
除此之外,我还想了解这种基于Monad构建AST方案的更多适用场景,比如结合forM_、when这类函数来灵活构建AST的方法,我的最终目标是实现一个可以生成多目标语言代码的嵌入式DSL。
注:这里的
>>并非默认等同于*>,而是遵循定义:m >> k = m >>= (\_ -> k)
内容的提问来源于stack exchange,提问作者mcmayer
相关产品推荐
相关产品推荐

