Tag: 单变换器

Monad Transformers vs将parameter passing给函数

我是Haskell的新手,但了解Monad变形金刚如何使用。 然而,我仍然有困难抓住他们声称的优势,而不是将parameter passing给函数调用。 基于维基单片变形金刚解释 ,我们基本上有一个configuration对象定义为 data Config = Config Foo Bar Baz 并传递给它,而不是写这个签名的函数 client_func :: Config -> IO () 我们使用ReaderT Monad Transformer并将签名更改为 client_func :: ReaderT Config IO () 拉Config只是一个电话ask 。 函数调用从client_func c改变到runReaderT client_func c 精细。 但为什么这使我的应用程序更简单? 1 – 我怀疑Monad变形金刚有趣的事情,当你缝​​合很多function/模块一起形成一个应用程序。 但这是我的理解停止的地方。 有人可以摆脱一些光? 2-我找不到有关如何在Haskell中编写大型模块化应用程序的文档,其中模块公开了某种forms的API并隐藏了它们的实现,以及(部分)将其自己的状态和环境隐藏到其他模块中。 任何指针? (编辑:真实世界哈斯克尔说:“这种方法[Monad变形金刚] …扩展到更大的程序”,但没有明确的例子certificate这一说法) 编辑下面克里斯泰勒答案下面 Chris完美地解释了为什么在Transformer Monad中封装Config,State等等提供了两个好处: 它阻止了一个更高级别的函数必须保持它的types签名所需的所有参数,它调用的(子)函数不是自己使用的(参见getUserInput函数) 从而使更高级别的function对变压器Monad内容的变化更有弹性(比如说你想添加一个Writer来提供一个更低级别的function) 这是以改变所有函数的签名为代价的,以便它们在Transformer Monad中运行。 所以问题1被完全覆盖。 谢谢Chris。 问题2现在在这个SOpost中回答

哈斯克尔:电梯vs电梯

在什么情况下应该使用liftIO ? 当我使用ErrorT String IO , lift函数ErrorT IO动作ErrorT到ErrorT ,所以liftIO看起来是多余的。