Haskell MonadBaseControl的作用是什么?
我正在深入研究Yesod的monads,遇到了Haskell MonadBaseControl的作用是什么?,haskell,monads,Haskell,Monads,我正在深入研究Yesod的monads,遇到了MonadBaseControl。 我看了一下黑客文件,然后迷路了。有人能告诉我它试图解决的问题吗?它来自软件包,是一对类型类(另一个是)中的一个,通过支持实现它的monad的可选liftBase(resp.lift)操作来增强(resp.)。此增强版本不再在绝对基单子(resp.immediate base monad)中执行简单操作,而是使用一个函数获取基单子(resp.monad transformer)在该点的整个状态作为其唯一参数,并返回上
MonadBaseControl
。
我看了一下黑客文件,然后迷路了。有人能告诉我它试图解决的问题吗?它来自软件包,是一对类型类(另一个是)中的一个,通过支持实现它的monad的可选liftBase
(resp.lift
)操作来增强(resp.)。此增强版本不再在绝对基单子(resp.immediate base monad)中执行简单操作,而是使用一个函数获取基单子(resp.monad transformer)在该点的整个状态作为其唯一参数,并返回上述操作
正如软件包文档所述,此增强以及这些类型类的其余内容,允许您从绝对基单子(resp.immediate base monad)中提升函数,如catch
、alloca
、和forkIO
,这在(resp.)中存在的更简单方案中是不可能的因为后一对不允许提升函数的参数,所以只能提升结果,而所采用的方法允许两者
因此,可以与(resp.)一起使用的单子集(resp.monad transformers)是可以与(resp.)一起使用的单子集的一个严格子集,但出于同样的原因,前一组比后一组强大得多。Michael Snoyman实际上写了一篇关于单子控制的小教程: 该条的要点可能如下: 假设您有以下代码:
withMyFile :: (Handle -> IO a) -> IO a
withMyFile = withFile "test.txt" WriteMode
您可以将withMyFile
应用于句柄->IO a
类型的任何函数,并获得一个漂亮的IO a
值。但是,如果您有一个类型为Handle->error MyError IO a
的函数,并且想要获取类型为error MyError IO a
的值,该怎么办?好的,基本上,您必须用MyFile修改,
,以便合并大量的包装/展开。MonadBaseControl允许您将类似于withMyFile
的功能“提升”到某些monad Transformer,从而允许展开(“运行”)。因此,生成的代码如下所示:
useMyFileError :: (Handle -> ErrorT MyError IO ()) -> ErrorT MyError IO ()
useMyFileError func = control $ \run -> withMyFile $ run . func
实际上,它来自于,包描述中说“这个包定义了类型类MonadBaseControl,MonadBase的一个子集,可以从IO或任何其他基本monad中提取通用控制操作,如catch。”但不幸的是,它没有告诉我它要解决的问题。请看一下[lifted base](hackage.haskell.org/package/liftedbase)。它提供了许多基于
IO
的标准函数的提升版本。例如,使用MonadBaseControl
可以编写一段代码,在基于IO
的复杂monad堆栈中运行,并在该堆栈中调用,将monad拥有的任何上下文也传输到分叉线程中。一位同事编写了非常好的介绍和演练: