在我的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) 我见过人们为各种懒惰的IO相关任务推荐管道/管道库.这些库到底解决了什么问题?
此外,当我尝试使用一些与hackage相关的库时,很可能有三个不同的版本.例:
这让我很困惑.对于我的解析任务,我应该使用attoparsec或pipes-attoparsec/attoparsec-conduit?与普通香草attoparsec相比,管道/导管版本给我带来了什么好处?
我想学习这个概念,这样我就能理解和使用诸如机器之类的库.
我试图关注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它是什么以及它为什么被量化.或者,管道式库和机器之间的概念差异是什么?
我已经习惯zipSinks :: Monad m => Sink i m r -> Sink i m r' -> Sink i m (r, r')了这个,但它被认为已被弃用了.
在我看来,这两个想法之间存在着密切的联系.我的猜测是,如果有一种方法可以用迭代器表示任意图形,那么FRP可以用Iteratees来实现.但是afaik他们只支持链式结构.
有人可以对此有所了解吗?
我试图了解导管和管道之间的差异.与管道不同,管道具有剩余物的概念.什么是剩菜有用?我想看一些剩菜必不可少的例子.
由于管道没有剩余的概念,有没有办法与它们实现类似的行为?
我已经将以下重写规则添加到管道而没有问题:
{-# 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) 我想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) 开始使用conduit,我注意到在Data.Conduit.Util中:
实用程序功能来自旧版本的管道.这些应该被视为已弃用,因为现在有更简单的方法来处理它们的用例.提供此模块仅用于向后兼容.
我特别关注的是zip :: Monad m => Source m a -> Source m b -> Source m (a, b).这对我来说似乎非常有用 - 我可以独立地研究生成as的方法和生成bs的方法,然后zip在需要时将它们放在一起,而不是在过程的早期混合关注.
但是,就像我说的那样,我是管道的新手,所以我无知.这些"更简单的方法来处理他们的用例"是什么?