2016-12-02 2 views
2

Wenn ich die folgende Source:Haskell Leitungsfilter unterschiedliche Werte

sourceList [1,3,3,1,2,3] 

Ist es möglich, einige Filter oder combinator nur erlauben unterschiedliche Werte gelten für stromabwärts geführt werden?

Also in meinem Beispiel würde nur [1,3,2] stromabwärts weitergegeben werden?

+0

Gibt es nichts mehr Sie über diese Werte wissen? Es wäre viel einfacher, diese Liste mit einer Art von Metadaten zu filtern. – suffi

+2

Beachten Sie, dass ein "Nub" Conduit wie dieser nicht strömen würde. Es wird unbestimmten Speicher verwenden, da die Leitung auf die eine oder andere Weise aufnehmen muss, was sie beispielsweise gesehen hat. in einem Data.Set.Set – Michael

+0

@suffi in meinem Fall, der Typ ist nur eine Liste von Ids – tmortiboy

Antwort

5

So etwas sollte tun:

#!/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() 

Bei der Ausführung:

sibi::casey { ~/scripts }-> ./cond.hs 
[1,3,2] 
+3

Für bessere algorithmische Komplexität, könnten Sie stattdessen eine 'Set' oder' HashSet' verwenden, obwohl das eine 'Ord' oder' Hashable 'constraint resp. –

0
#!/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) 

Bei der Ausführung:

C:\Users\Gurkenglas\scripts>stack conduitnub.hs 
[1,3,2] 
Verwandte Themen