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

标签 haskell yesod monad-transformers

我想使用 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/

相关文章:

Scalaz:过滤器在|@|中扮演什么角色?

haskell - 顶层的裸露表达用于简单的 Template Haskell 实验

haskell - $forall : why it doesn't bring deconstructed members in scope? 中的小村庄模板和解构数据

haskell - 使用 ReaderT Maybe 还是 MaybeT Reader?

haskell - 对于 cabal,only-dependencies 标志是什么意思?

Haskell 递归以 'do' 表示法

haskell - 如何调用同一个函数 'n'次?

haskell - 如何在 GADT 中使用受限约束?

haskell - 如何在哈姆雷特中使用 $maybe

Haskell:Monad 变压器和全局状态