我想在Haskell中编写一个嵌入式DSL,我可以用另一种语言生成代码(即Python,但这与问题无关)。有很多不同的方法可以做到这一点,比如使用我所知道的 Free monad 解释器或无标记解释器。但是我所知道的任何方法似乎都无法捕获函数定义,哪种有意义,但也非常有限。
我的问题是:如何将实际的Haskell功能嵌入到DSL中?我们的想法是捕获一个Haskell函数定义到类似Lam var body
构造函数的东西,它看起来像:
data Var = Var ... -- use DeBruijn numbering?
data Expr repr = Lam Var repr
理想情况下,我希望能够写出如下内容:
foo :: Expr repr
foo = \ n -> n + n * 12
然后能够以各种方式解释此Expr
,包括生成外部代码。
我使用https://hackage.haskell.org/package/data-reify进行了实验,它提供了一些捕获函数的技术,但并没有走得太远。我正在寻找的是什么?