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(目前正在路上移动)。我感谢你的帮助!