标签: conduit

一个处理管道,2个相同类型的IO源

在我的GHC Haskell应用程序中使用stm,network-conduit和conduit,我为每个socket自动分叉使用了一个strand runTCPServer.Strands可以通过使用广播TChan与其他线路进行通信.

这展示了我想如何建立管道"链":

在此输入图像描述

所以,我们这里有两个源(每个都绑定到辅助管道),它们产生一个接受并转入的Packet对象,然后发出套接字.对于两个输入的有效(性能是一个问题),我遇到了很大的困难.encoderByteString

如果有人能指出我正确的方向,我将不胜感激.


既然我没有尝试就发布这个问题是不礼貌的,我会把我以前在这里尝试过的东西放进去;

我已经编写/编写了一个函数,它(阻塞)从TMChan(可关闭的通道)生成一个源;

-- | Takes a generic type of STM chan and, given read and close functionality,
--   returns a conduit 'Source' which consumes the elements of the channel.
chanSource 
    :: (MonadIO m, MonadSTM m)
    => a                    -- ^ The channel
    -> (a -> STM (Maybe b)) -- ^ The read function
    -> (a -> STM ())        -- ^ The close/finalizer function
    -> Source m b
chanSource …
Run Code Online (Sandbox Code Playgroud)

networking haskell tms stm conduit

62
推荐指数
1
解决办法
2292
查看次数

什么是管道/管道试图解决

我见过人们为各种懒惰的IO相关任务推荐管道/管道库.这些库到底解决了什么问题?

此外,当我尝试使用一些与hackage相关的库时,很可能有三个不同的版本.例:

这让我很困惑.对于我的解析任务,我应该使用attoparsec或pipes-attoparsec/attoparsec-conduit?与普通香草attoparsec相比,管道/导管版本给我带来了什么好处?

haskell pipe conduit haskell-pipes

49
推荐指数
3
解决办法
5859
查看次数

调查员与管道与管道的利弊是什么?

我想从别人有更深的了解比我的根本区别是什么之间听到普查员,管道管道以及主要优点和缺点.一些讨论已经 在进行中,但有一个高级概述是很好的.

haskell enumerators conduit

34
推荐指数
2
解决办法
3032
查看次数

机器和管道(或其他类似的库)之间的概念差异是什么?

我想学习这个概念,这样我就能理解和使用诸如机器之类的库.

我试图关注RúnarBjarnason关于机器的讨论,但信息太少,基本上只是一堆数据类型.我甚至无法理解什么k

newtype Machine k o = Step k o (Machine k o)
data Step k o r = Stop
                | Yield o r
                | forall t . Await (t -> r) (k t) r
Run Code Online (Sandbox Code Playgroud)

或者t它是什么以及它为什么被量化.或者,管道式库和机器之间的概念差异是什么?

haskell conduit transducer-machines

28
推荐指数
1
解决办法
2735
查看次数

组合两个水槽的首选方法是什么?

我已经习惯zipSinks :: Monad m => Sink i m r -> Sink i m r' -> Sink i m (r, r')了这个,但它被认为已被弃用了.

haskell conduit

21
推荐指数
2
解决办法
930
查看次数

Iteratees和FRP之间有什么联系?

在我看来,这两个想法之间存在着密切的联系.我的猜测是,如果有一种方法可以用迭代器表示任意图形,那么FRP可以用Iteratees来实现.但是afaik他们只支持链式结构.

有人可以对此有所了解吗?

haskell frp iterate conduit haskell-pipes

19
推荐指数
2
解决办法
864
查看次数

导管残羹剩饭的好处是什么?

我试图了解导管管道之间的差异.与管道不同,管道具有剩余物的概念.什么是剩菜有用?我想看一些剩菜必不可少的例子.

由于管道没有剩余的概念,有没有办法与它们实现类似的行为?

haskell conduit haskell-pipes

14
推荐指数
2
解决办法
1013
查看次数

具有类约束的GHC重写规则

我已经将以下重写规则添加到管道而没有问题:

{-# RULES "ConduitM: lift x >>= f" forall m f.
    lift m >>= f = ConduitM (PipeM (liftM (unConduitM . f) m))
  #-}
Run Code Online (Sandbox Code Playgroud)

我想增加一个类似重写规则liftIO以及

{-# RULES "ConduitM: liftIO x >>= f" forall m f.
    liftIO m >>= f = ConduitM (PipeM (liftM (unConduitM . f) (liftIO m)))
  #-}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试这样做时,我从GHC收到以下错误消息:

Data/Conduit/Internal/Conduit.hs:1025:84:
    Could not deduce (Monad m) arising from a use of ‘liftM’
    from the context (Monad (ConduitM i o m), MonadIO (ConduitM i o m))
      bound by the …
Run Code Online (Sandbox Code Playgroud)

haskell ghc conduit

14
推荐指数
1
解决办法
403
查看次数

如何在Haskell中实现`cat`?

我想cat在Haskell中编写一个简单的程序.我想将多个文件名作为参数,并将每个文件顺序写入STDOUT,但我的程序只打印一个文件并退出.

我需要做什么才能让我的代码打印每个文件,而不仅仅是传入的第一个文件?

import Control.Monad as Monad
import System.Exit
import System.IO as IO
import System.Environment as Env

main :: IO ()
main = do
    -- Get the command line arguments
    args <- Env.getArgs

    -- If we have arguments, read them as files and output them
    if (length args > 0) then catFileArray args

    -- Otherwise, output stdin to stdout
    else catHandle stdin

catFileArray :: [FilePath] -> IO ()
catFileArray files = do
    putStrLn $ "==> Number of …
Run Code Online (Sandbox Code Playgroud)

haskell conduit

13
推荐指数
4
解决办法
2394
查看次数

弃用Data.Conduit.Util的zip的需求是什么"更简单的方法"?

开始使用conduit,我注意到在Data.Conduit.Util中:

实用程序功能来自旧版本的管道.这些应该被视为已弃用,因为现在有更简单的方法来处理它们的用例.提供此模块仅用于向后兼容.

我特别关注的是zip :: Monad m => Source m a -> Source m b -> Source m (a, b).这对我来说似乎非常有用 - 我可以独立地研究生成as的方法和生成bs的方法,然后zip在需要时将它们放在一起,而不是在过程的早期混合关注.

但是,就像我说的那样,我是管道的新手,所以我无知.这些"更简单的方法来处理他们的用例"是什么?

zip haskell conduit

12
推荐指数
1
解决办法
282
查看次数