【发布时间】:2023-03-19 20:49:01
【问题描述】:
假设我使用 monad 在 Haskell 中为自己创建了一种嵌入式领域特定语言。例如,一种简单的语言,可以让您在堆栈上推送和弹出值,使用 state monad 实现:
type DSL a = State [Int] a
push :: Int -> DSL ()
pop :: DSL Int
现在我可以使用 do 表示法编写小型堆栈操作程序:
program = do
push 10
push 20
a <- pop
push (5*a)
return a
但是,我真的很想通过 REPL 交互式地使用我的 DSL(特别是 GHCi,如果有帮助,我愿意使用其他的)。
很遗憾有这样的会议:
>push 10
>pop
10
>push 100
不会立即起作用,这可能是相当合理的。但是,我真的认为能够以类似的感觉做一些事情会很酷。 state monad 的工作方式并不容易做到这一点。您需要构建您的 DSL a 类型,然后对其进行评估。
有没有办法做这样的事情。在 REPL 中增量使用 monad?
我一直在研究诸如operational、MonadPrompt 和MonadCont 之类的东西,我觉得它们可能可以用来做这样的事情。不幸的是,我看到的例子都没有解决这个特殊问题。
【问题讨论】:
-
为您的语言编写解析器并运行您自己的 REPL?
-
你当然不能对任意单子这样做。如果有问题的 monad 是
data Proxy a = Proxy怎么办?当有人在提示符下运行Proxy计算时,你会打印什么? -
@Zeta 这是我曾想过的,但它不再是一个嵌入式 DSL。有时这就是你想要的,我问了这个问题,看看是否可以使用 REPL 中的嵌入式 DSL。
标签: haskell monads read-eval-print-loop ghci