我想使用 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
我不知道你通常尝试做的事情是否是一个好主意,但这应该可以进行类型检查。
关于haskell - Yesod的Handler Monad是MonadBaseControl IO的实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68351343/