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

Is Yesod's Handler Monad an instance of MonadBaseControl IO?

我想使用 Data.Pool library in my handler code. I am trying to determine if Handler is an instance of MonadBaseControl IO 中的 withResource :: MonadBaseControl IO m => Pool a -> (a -> m b) -> m b ,但我很难找到定义 Handler 的确切位置。

Yesod's Handler Monad(由 mkYesodData 创建)是 MonadBaseControl IO 的一个实例还是可以很容易地合并成一个实例?

不,Handler 没有 MonadBaseControl IO 实例。

不过基本上是一个reader,所以写一个也不是太难

假设您使用的是脚手架站点,则以下内容应该有效。在 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

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