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]