Yesod 的 Handler Monad 是 MonadBaseControl IO 的实例吗?

问题描述

我想在我的处理程序代码中使用 Data.Pool 库中的 withResource :: MonadBaseControl IO m => Pool a -> (a -> m b) -> m b 。我试图确定 Handler 是否是 MonadBaseControl IO 的实例,但我很难找到定义 Handler 的确切位置。

Yesod's Handler Monad(由 mkYesodData 创建)是 MonadBaseControl IO一个实例还是可以轻松地将其整合为一个实例?

解决方法

不,Handler 没有 MonadBaseControl IO 实例。

不过,它基本上是一个阅读器,所以写一个并不太难。

假设您使用的是脚手架站点,以下应该可以工作。在 Foundation 的顶部添加一些扩展和导入:

import Control.Monad.Base
import Control.Monad.Trans.Control
import Yesod.Core.Types (HandlerFor(..))

mkYesodData 语句之后的某个方便的地方,添加实例:

instance MonadBase IO Handler where
  liftBase = liftIO
instance MonadBaseControl IO Handler where
  type StM Handler a = a
  liftBaseWith ioAct = HandlerFor $ \handlerData ->
    ioAct (\handlerAct -> unHandlerFor handlerAct handlerData)
  restoreM = return

我不知道你通常尝试做的是否是一个好主意,但这应该让事情进行类型检查。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...