我想了解管道解析3.0如何工作的案件除了span
和splitAt
,並不能完全弄清楚如何讓事情奏效。基本思想是我有一個同構,並且我想映射所有輸入值以便將A
類型轉換爲B
類型。那麼,我想所有的剩飯都從B
轉換回A
。我將如何在pipes-parse
中完成此操作?使用管道解析來保存與地圖的殘羹剩飯
爲了比較,代碼如下所示在conduit
:
import Control.Applicative ((<$>), (<*>))
import Data.Conduit (yield, ($$), (=$=))
import Data.Conduit.Extra (fuseLeftovers)
import qualified Data.Conduit.List as CL
newtype A = A Int
deriving Show
newtype B = B Int
deriving Show
atob (A i) = (B i)
btoa (B i) = (A i)
main :: IO()
main = do
let src = mapM_ (yield . A) [1..10]
res <- src $$ (,,,)
<$> fuseLeftovers (map btoa) (CL.map atob) CL.peek
<*> CL.take 3
<*> (CL.map atob =$= CL.take 3)
<*> CL.consume
print res
編輯:爲了澄清,這裏是我的上述代碼的輸出:
(Just (B 1),[A 1,A 2,A 3],[B 4,B 5,B 6],[A 7,A 8,A 9,A 10])
而且,原流類型爲A
。我們轉換爲B
並在第一個元素上查看,然後將下3個元素作爲A
類型,然後將以下三個元素作爲B
,最後將其餘的值作爲A
。
我更新了我的問題以澄清。我給出的例子表現了稍微不同的工作。將你提供的內容轉換爲原始功能似乎應該是微不足道的,但我一直無法做到。 –
最後一個評論,我想我想通了:https://gist.github.com/snoyberg/8888998。我添加了一些跟蹤語句來試圖瞭解您對減少映射數量的意見。現在看起來整個流是來回轉換的,那是你在做什麼? –
@MichaelSnoyman來回轉換似乎來自'zoom(piso ab)Pp.peek',除了那部分,只有中間的三個元素有'atob'叫它們,就像我所期望的那樣。 – Davorak