大Monad堆栈的示例

nud*_*ded 6 monads haskell monad-transformers

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

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

Pet*_*ann 8

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

type InputCmdT m = StateT Layout (UndoT (StateT HistLog (ReaderT (IORef KillRing)
                (ReaderT Prefs (ReaderT (Settings m) m)))))
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*lor 5

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

type Eval a = ReaderT Environment (ErrorT LispError IO a)
Run Code Online (Sandbox Code Playgroud)

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

type EvalCont r a = ContT r (ReaderT Environment (ErrorT LispError IO a))
Run Code Online (Sandbox Code Playgroud)

我从未完成实现延续,但你可以通过在Github上查看它来看到我有多远.