Haskell管道过滤不同的值

tmo*_*boy 2 haskell filter distinct-values conduit

如果我使用以下内容Source:

 sourceList [1,3,3,1,2,3]
Run Code Online (Sandbox Code Playgroud)

是否可以应用某些过滤器或组合器来仅允许向下游传递不同的值?

所以在我的例子中,只会[1,3,2]传递到下游?

Sib*_*ibi 5

这样的事情应该做:

#!/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 ()
Run Code Online (Sandbox Code Playgroud)

执行时:

sibi::casey { ~/scripts }-> ./cond.hs
[1,3,2]
Run Code Online (Sandbox Code Playgroud)

  • 为了更好的算法复杂性,你可以使用`Set`或`HashSet`来代替,尽管分别会产生`Ord`或`Hashable`约束. (3认同)