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
我不知道您通常 尝试做的事情是否是个好主意,但这应该可以进行类型检查。
我想使用 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
我不知道您通常 尝试做的事情是否是个好主意,但这应该可以进行类型检查。