问题描述
我想在我的处理程序代码中使用 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
我不知道你通常尝试做的是否是一个好主意,但这应该让事情进行类型检查。