Haskell 管道过滤器不同的值
Haskell conduit filter distinct values
如果我使用以下 Source
:
sourceList [1,3,3,1,2,3]
是否可以应用一些过滤器或组合器来只允许向下游传递不同的值?
所以在我的例子中,只有 [1,3,2]
会被传递到下游?
应该这样做:
#!/usr/bin/env stack
-- stack --resolver lts-6.19 runghc --package conduit-combinators
import Conduit
import Data.Conduit.List (sourceList)
main = do
print $ runConduitPure $ sourceList [1,3,3,1,2,3] .| myConduit [] .| sinkList
myConduit dup = do
num <- await
case num of
Just x -> if x `elem` dup
then myConduit dup
else do
yield x
myConduit (x:dup)
Nothing -> return ()
执行时:
sibi::casey { ~/scripts }-> ./cond.hs
[1,3,2]
#!/usr/bin/env stack
-- stack --resolver lts-6.19 runghc --package conduit-combinators
import Conduit
import Data.Conduit.List (sourceList, mapAccum, catMaybes)
import Control.Monad (void)
main = do
print $ runConduitPure $ sourceList [1,3,3,1,2,3] .| void (mapAccum foo []) .| catMaybes .| sinkList
foo :: Int -> [Int] -> ([Int], Maybe Int)
foo x dup | x `elem` dup = (dup, Nothing)
foo x dup = (x:dup, Just x)
执行时:
C:\Users\Gurkenglas\scripts>stack conduitnub.hs
[1,3,2]
如果我使用以下 Source
:
sourceList [1,3,3,1,2,3]
是否可以应用一些过滤器或组合器来只允许向下游传递不同的值?
所以在我的例子中,只有 [1,3,2]
会被传递到下游?
应该这样做:
#!/usr/bin/env stack
-- stack --resolver lts-6.19 runghc --package conduit-combinators
import Conduit
import Data.Conduit.List (sourceList)
main = do
print $ runConduitPure $ sourceList [1,3,3,1,2,3] .| myConduit [] .| sinkList
myConduit dup = do
num <- await
case num of
Just x -> if x `elem` dup
then myConduit dup
else do
yield x
myConduit (x:dup)
Nothing -> return ()
执行时:
sibi::casey { ~/scripts }-> ./cond.hs
[1,3,2]
#!/usr/bin/env stack
-- stack --resolver lts-6.19 runghc --package conduit-combinators
import Conduit
import Data.Conduit.List (sourceList, mapAccum, catMaybes)
import Control.Monad (void)
main = do
print $ runConduitPure $ sourceList [1,3,3,1,2,3] .| void (mapAccum foo []) .| catMaybes .| sinkList
foo :: Int -> [Int] -> ([Int], Maybe Int)
foo x dup | x `elem` dup = (dup, Nothing)
foo x dup = (x:dup, Just x)
执行时:
C:\Users\Gurkenglas\scripts>stack conduitnub.hs
[1,3,2]