- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在玩 Bryan O'Sullivan 的 resource-pool图书馆并有关于扩展 withResource
的问题功能。
我想更改 withResource
的签名函数来自 (MonadBaseControl IO m) => Pool a -> (a -> m b) -> m b
至(MonadBaseControl IO m) => Pool a -> (a -> m (Bool, b)) -> m b
.
我想要实现的是,该操作应该返回 (Bool, b)
元组,其中 bool 值指示借用的资源是否应该
被放回池中或销毁。
现在我当前的实现如下所示:
withResource :: forall m a b. (MonadBaseControl IO m) => Pool a -> (a -> m (Bool, b)) -> m b
{-# SPECIALIZE withResource :: Pool a -> (a -> IO (Bool,b)) -> IO b #-}
withResource pool act = fmap snd result
where
result :: m (Bool, b)
result = control $ \runInIO -> mask $ \restore -> do
resource <- takeResource pool
ret <- restore (runInIO (act resource)) `onException`
destroyResource pool resource
void . runInIO $ do
(keep, _) <- restoreM ret :: m (Bool, b)
if keep
then liftBaseWith . const $ putResource pool resource
else liftBaseWith . const $ destroyResource pool resource
return ret
而且我有一种感觉,这不是它应该看起来的样子......
MonadBaseControl
API 对。
最佳答案
我觉得这种方法存在根本问题。对于 StM M a
的单子(monad)等于/同构 a
它会起作用的。但是对于其他 monad 来说就会有问题。让我们考虑MaybeT IO
. a -> MaybeT IO (Bool, b)
类型的操作可能会失败,所以不会有Bool
产生的值(value)。和代码
void . runInIO $ do
(keep, _) <- restoreM ret :: m (Bool, b)
...
restoreM
处停止.对于
ListT IO
情况会更糟,如
putResource
和
destroyResource
将被执行多次。考虑这个示例程序,它是您的函数的简化版本:
{-# LANGUAGE FlexibleContexts, ScopedTypeVariables, RankNTypes, TupleSections #-}
import Control.Monad
import Control.Monad.Trans.Control
import Control.Monad.Trans.List
foo :: forall m b . (MonadBaseControl IO m) => m (Bool, b) -> m b
foo act = fmap snd result
where
result :: m (Bool, b)
result = control $ \runInIO -> do
ret <- runInIO act
void . runInIO $ do
(keep, _) <- restoreM ret :: m (Bool, b)
if keep
then liftBaseWith . const $ putStrLn "return"
else liftBaseWith . const $ putStrLn "destroy"
return ret
main :: IO ()
main = void . runListT $ foo f
where
f = msum $ map (return . (, ())) [ False, True, False, True ]
destroy
return
destroy
return
withResource :: forall m a b. (MonadBaseControl IO m)
=> Pool a -> (a -> IO () -> m b) -> m b
IO ()
参数将是一个函数,该函数在执行时会使当前资源无效并将其标记为销毁。 (或者,为了更方便,将
IO ()
替换为提升后的
m ()
)。然后在内部,因为它是
IO
-基于,我只创建一个助手
MVar
可以通过调用来重置
关于haskell - 使用 `MonadBaseControl` API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32314565/
MonadBaseControl class提供很少的法律。获取something I want ,我还需要一个: forall f q. f liftBaseWith q = liftBase
我正在深入研究 Yesod 的 monad,并且遇到了 MonadBaseControl . 我看了一下hackage doc,然后迷路了。有人可以告诉我它试图解决的问题吗? 最佳答案 Michael
在模块threads中的Control.Concurrent.Thread.Group包中,有一个函数forkIO: forkIO :: ThreadGroup -> IO α -> IO (Thre
我目前正在玩 Bryan O'Sullivan 的 resource-pool图书馆并有关于扩展 withResource 的问题功能。 我想更改 withResource 的签名函数来自 (Mona
我想弄清楚如何实现 MonadBaseControl 的实例对于 Foo 类型,它是 StateT 实例的新型包装器。你会认为它会像 this 一样实现但情况似乎并非如此。我假设状态块是导致这里问题的
如何使用MonadBaseControl来自 monad-control抬起simpleHTTP happstack-server 中定义的函数? simpleHTTP 的当前类型: simpleHT
假设我有简单的 newtype 声明 newtype Foo a = Foo { unFoo :: ReaderT Int IO a } 我想制作 MonadBaseControl IO 的 Foo
我正在尝试学习 Haskell 中的 Conduits。这听起来很有趣,但类型很快就会变得非常困惑。 到目前为止,我已经编写了以下文件:https://gist.github.com/anonymou
我想用withResource :: MonadBaseControl IO m => Pool a -> (a -> m b) -> m b 来自 Data.Pool我的处理程序代码中的库。我想确定
我在沙盒中安装来自 Hackage 的最新 ghc-mod (5.2.1.1) 时遇到此错误: [15 of 38] Compiling Language.Haskell.GhcMod.CabalCo
我是一名优秀的程序员,十分优秀!