2016-05-04 8 views
1

So lese ich "Learn You A Haskell" und in der chapter about modules gibt es eine Definition einer Funktion namens Suche, die überprüft, ob eine Liste eine Unterliste enthält.Verwenden von foldr für Suche statt falten in haskell

my_search :: Eq a => [a] -> [a] -> Bool 
my_search sub l = 
    let 
    len = length sub 
    eqTest = (\acc x -> if take len x == sub then True else acc) 
    in foldl eqTest False $ tails l 

Nun frage ich mich, warum foldl' nicht benutzen, die weiter oben in diesem Kapitel erwähnt wurde, und läuft schneller:

my_search' :: Eq a => [a] -> [a] -> Bool 
my_search' sub l = 
    let 
    len = length sub 
    eqTest = (\acc x -> if take len x == sub then True else acc) 
    in foldl' eqTest False $ tails l 


*Main> my_search [10^6,10^6+1] [1..10^7] 
True 
(7.76 secs, 3,197,168,792 bytes) 

*Main> my_search' [10^6,10^6+1] [1..10^7] 
True 
(4.53 secs, 2,964,986,352 bytes) 

Noch besser wäre es, mit einer kleinen Anpassung, können wir foldr verwenden, die auch verarbeiten kann unendliche Listen durch Kurzschließen.

my_searchr :: Eq a => [a] -> [a] -> Bool 
my_searchr sub l = 
    let 
    len = length sub 
    eqTest = (\x acc -> if take len x == sub then True else acc) 
    in foldr eqTest False $ tails l 

am definition von isInfixOf Sehen, ich sehe es mit any implementiert ist, die foldr verwendet.

Fehle ich etwas oder ist es besser, foldr in diesem Fall zu verwenden?

+1

ist es wahrscheinlich, weil die Autoren sich nicht um Leistung kümmerten, aber über die Module hier (?) ... – Carsten

+0

Einige mehr Details über den Unterschied zwischen den verschiedenen Falten: https://wiki.haskell.org/Foldr_Foldl_Foldl ' – ErikR

+1

@ ErikR. Danke, ich habe das Wiki gelesen und AFAIU, 'foldl' wird fast nie benutzt. – dimid

Antwort

4

Fehle ich etwas oder ist es besser, foldr in diesem Fall zu verwenden?

Nein, Sie verpassen nichts, und Ihre Analyse ist richtig; foldl ist hier nicht das richtige Werkzeug, und sogar foldl' ist zweifelhaft; Die vorliegende Aufgabe profitiert von Faulheit, daher sollte foldr verwendet werden.

+0

Danke, in" so foldl sollte verwendet werden. ", Meinst du 'fold'? – dimid

+0

Natürlich ...: -] –

Verwandte Themen