Haskell 在实现MonadIO的Monad中嵌入异步
我有一些Haskell 在实现MonadIO的Monad中嵌入异步,haskell,haskell-pipes,Haskell,Haskell Pipes,我有一些管道并发性代码如下: -- this won't compile but will give you the gist of what's happening pipeline :: MonadIO m => Consumer a m () main = do (output, input) <- spawn Unbounded async $ do runEffect $ fromInput input >-> pipeline
管道并发性代码如下:
-- this won't compile but will give you the gist of what's happening
pipeline :: MonadIO m => Consumer a m ()
main = do
(output, input) <- spawn Unbounded
async $ do runEffect $ fromInput input >-> pipeline
performGC
-- skipped the `output` pipeline code.
——这不会编译,但会为您提供正在发生的事情的要点
管道::MonadIO m=>消费者a m()
main=do
(输出、输入)->管道
性能
--跳过了“输出”管道代码。
问题1:这显然不会编译,因为runEffect
将返回MonadIO m=>m()
,async
需要IO a
。有办法做到这一点吗?还是我一直在强迫我的管道在IO单子中包含效果
问题2:在实现MonadIO的Monad中嵌入异步是否有意义?不确定我在这里是否表达得很好
谢谢大家!
这显然不会编译,因为runEffect
将返回MonadIO m=>m()
并且异步需要IO a
那不太对IO
是MonadIO
的一个实例,因此runEffect
的输出可以传递给async
,例如,一个函数接受MaybeT IO()
(也是MonadIO
实例)
我认为您正在寻找的是,它可以让您将Async
返回的特定IO(Async a)
提升到类型签名中所要求的多态MonadIO
类型
...
liftIO $ async $ do runEffect $ fromInput input >-> pipeline
performGC
我还没有试着编译这个;您可能还需要提升功能的其他IO
部分
问题2:在实现MonadIO的Monad中嵌入异步是否有意义?不确定我在这里是否表达得很好
当然,如果您想在某些monad堆栈中实现并发,为什么不呢?我正在尝试做完全相同的事情,这是问题的核心:
$ :t async . runEffect
async . runEffect :: Effect IO a -> IO (Async a)
$
简而言之,我希望提供这种类型的东西。但我真正想要的类型是:
someAsync . runEffect :: MonadIO m => Effect m a -> m (Async a)
不幸的是,我不知道如何做到这一点。目前,这似乎是不可能的,但这并不是因为管道的并发性,而纯粹是因为异步的类型
我认为我们应该向这两个库的开发人员指出这个问题,否则,我不知道如何获得我想要的类型
编辑1:我发现了这个问题
编辑2:我喜欢管道库,但我很难找到解决此问题的方法。如果我找不到这个问题的答案,那是因为它似乎很好地解决了这个问题
编辑3:似乎这个问题的正确解决方案是使用。此库提供以下方法:
async :: MonadBaseControl IO m => m a -> m (Async (StM m a))
只要你为你的Monad实现MonadBaseControl IO,这应该正是你想要的。问题是runEffect
将返回m()
和async
需要IO a
@weirdcanada,正如我说的,这不是问题所在。您可以用GHCi中的虚拟实现说服自己。输入以下行:数据效果mr=效果(mr)
,让runEffect::Monad m=>效果mr->mr;runEffect=undefined
,数据异步a
,让异步::IO a->IO(异步a);async=undefined
,:t async$runEffect undefined
。你可能有其他的问题,但是如果没有一个嗯。。。我想我错过了什么。我很快就会得到一个SSCCE(目前正在路上移动)。我感谢你的帮助!