6

正如标题所说,我正在寻找一个将 monad-transformers 与大量 Monad 结合使用的程序。

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

4

2 回答 2

8

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

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

这实际上会产生奇怪的效果,例如在 System.Console.Haskeline.Emacs 中将一个类型签名吹到至少一个 GHC 版本超过 20.000 行......

于 2012-10-12T10:28:10.157 回答
5

我不知道这是否算作“真实世界”,但在我对教程的扩展中,在 48 小时内为自己编写一个方案,我为使用以下堆栈的编程语言实现了一个解释器:

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

我开始通过定义为语言添加延续

type EvalCont r a = ContT r (ReaderT Environment (ErrorT LispError IO a))

我从来没有完成实现延续,但你可以通过在 Github 上查看它来了解我已经走了多远。

于 2012-10-12T07:53:12.753 回答