我试图了解管道解析 3.0 如何处理除span
and之外的情况splitAt
,但无法完全弄清楚如何让事情正常进行。基本思想是我有一个同构,我想映射所有输入值以从 type 转换A
为 type 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 个元素作为 type A
,然后将以下三个作为B
,最后将其余的作为A
。