如何在Haskell中的嵌入式DSL中捕获更高阶的函数?

时间:2018-05-24 15:22:04

标签: haskell dsl

我想在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进行了实验,它提供了一些捕获函数的技术,但并没有走得太远。我正在寻找的是什么?

0 个答案:

没有答案