【问题标题】:Is Yesod's Handler Monad an instance of MonadBaseControl IO?Yesod 的 Handler Monad 是 MonadBaseControl IO 的一个实例吗?
【发布时间】:2021-09-21 20:30:57
【问题描述】:

我想在我的处理程序代码中使用来自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 是指哪个?但我想这是你问题的一部分。您是如何访问此Handler 的?你的进口是什么?您是否关注过一些提到此Handler 的学习资源?
  • Handler Monad 由 mkYesodData 在标准 Yesod 设置中创建。事实上,这个 monad 是由一个 Template 创建的,这使得它很难追踪。

标签: haskell yesod monad-transformers


【解决方案1】:

不,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

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

【讨论】:

  • “我不知道您通常尝试做的是否是一个好主意,” MongoDB 的Persistent 实现既过时又不适合文档数据库。我正在降低一个级别并直接使用 Haskell MongoDB 驱动程序。我正在将一个 MongoDB Pipes 池添加到 App。 #ReinventingTheWheel
猜你喜欢
  • 2020-11-12
  • 1970-01-01
  • 2011-09-27
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
相关资源
最近更新 更多