正如标题所说,我正在寻找一个将 monad-transformers 与大量 Monad 结合使用的程序。
有人知道真实世界的例子吗?
正如标题所说,我正在寻找一个将 monad-transformers 与大量 Monad 结合使用的程序。
有人知道真实世界的例子吗?
一个很好的例子是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 行......
我不知道这是否算作“真实世界”,但在我对教程的扩展中,在 48 小时内为自己编写一个方案,我为使用以下堆栈的编程语言实现了一个解释器:
type Eval a = ReaderT Environment (ErrorT LispError IO a)
我开始通过定义为语言添加延续
type EvalCont r a = ContT r (ReaderT Environment (ErrorT LispError IO a))
我从来没有完成实现延续,但你可以通过在 Github 上查看它来了解我已经走了多远。