大Monad堆栈的示例

时间:2012-10-12 06:45:24

标签: haskell monads monad-transformers

正如标题所说,我正在寻找一个程序,它使用monad-transformer和一大堆Monads。

有人知道一个真实世界的例子吗?

2 个答案:

答案 0 :(得分:8)

一个很好的例子是Haskeline - 它的内部InputCmdT类型是深度为6的monad变换器堆栈(参见here):

type InputCmdT m = StateT Layout (UndoT (StateT HistLog (ReaderT (IORef KillRing)
                (ReaderT Prefs (ReaderT (Settings m) m)))))

实际上可以产生奇怪的效果,例如在System.Console.Haskeline.Emacs中吹出一个类型签名,最多可以为至少一个GHC版本提供超过20,000行...

答案 1 :(得分:5)

我不知道这是否算作“真实世界”,但在我的教程Write Yourself a Scheme in 48 Hours的扩展中,我为使用以下堆栈的编程语言实现了一个解释器:

type Eval a = ReaderT Environment (ErrorT LispError IO a)

我开始通过定义

添加语言的延续
type EvalCont r a = ContT r (ReaderT Environment (ErrorT LispError IO a))

我从未完成继续实施,但你可以看到checking it out on Github到达了多远。

相关问题