2012-02-10 22 views
3

我使用network-conduit下面的代碼有問題,裏面的新來源:如何添加管道哈斯克爾

import Data.Conduit.List as CL 
import Data.Conduit.Text as CT 
import qualified Data.ByteString.Char8 as S8 
import qualified Data.Text as TT 

mySource :: ResourceT m => Integer -> Source m Int 
mySource i = {- function -} undefined 

myApp :: Application 
myApp src snk = 
    src $= CT.decode CT.ascii 
     $= CL.map decimal 
     $= CL.map {-problem here-} 
     $$ src 

在問題的地方,我想寫類似

\t -> case t of 
    Left err = S8.pack $ "Error:" ++ e 
    Right (i,xs) = (>>>=) mySource 
       {- or better: 
        do 
        (>>>=) mySource 
        (<<<=) T.pack xs 
        -} 

其中(>>>=)功能推mySource輸出到下一級 (<<<=)正在發送功能回到上一級

+0

'conduit'是否支持向上遊發送數據?我知道'管道'呢。也許你需要使用'pipes'作爲你的用例。 – Cactus 2016-03-30 06:54:10

+0

'Conduit'可以用'leftover'將數據重新輸入到它自己的輸入中,但是在這裏,'Conduit'想要將輸入推回到它的上游'Conduit'的輸入中,這是不可能的。在這種情況下應該使用解析器'Conduit'。 – pat 2017-11-27 21:20:02

回答

1

網絡將字節流切分爲任意ByteString塊。使用上面的代碼,那些ByteString塊將被映射到Text的塊,並且Text的每個塊將被解析爲decimal。然而,表示單個decimal的十進制數字串可以跨兩個(或更多)Text塊分開。另外,如您所知,使用decimal可以將Text區塊的其餘部分作爲decimal的一部分未被分析,您嘗試將其重新插入輸入流。

這兩個問題都可以通過使用Data.Conduit.Attoparsec. conduitParserEitherData.Attoparsec.Text.decimal來解決。請注意,僅僅解析decimal是不夠的;您還需要處理decimal之間的某種分隔符。

它也不可能拼接從CL.map一個Source,因爲CL.map的類型簽名

map :: Monad m => (a -> b) -> Conduit a m b 

傳遞給map功能得到一個機會,每個輸入a轉變成一個單一的輸出b,不是b的流。要做到這一點,您可以使用awaitForever,但您需要將Source轉換爲ProducertoProducer)以便類型匹配。

但是,在您的代碼中,您嘗試向ByteString的下游發送下游解析錯誤,但輸出mySourceInt,這是一種類型錯誤。在這兩種情況下,您必須提供ByteString的流;在成功的語法分析的情況下可以返回通過融合其它ConduitConduit「只要它與ByteString輸出結束了S:

... 
$= (let f (Left err) = yield $ S8.pack $ "Error: " ++ show err 
     f (Right (_, i)) = toProducer (mySource i) $= someOtherConduit 
    in awaitForever f) 

其中someOtherConduitInt」從mySource s和源ByteString的。

someOtherConduit :: Monad m => Conduit Int m ByteString 

最後,我相信你的意思的snk在管,而不是src的一端連接。

+0

代碼是爲conduit-0編寫的。4或者類似的東西,那裏根本沒有'生產者','消費者'和'管道',剩下的東西也不在那裏。我沒有這個問題在我身邊5年或更長時間,我不確定我是否能夠記住我爲什麼要用這種方式解決問題,並且如果回答涵蓋了我實際上遇到的問題。它會告訴我們正確的事情,所以這些日子對於使用導管的人來說可能是有用的,所以我將其標記爲已接受。 – qnikst 2017-12-04 19:05:29