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?
ist es wahrscheinlich, weil die Autoren sich nicht um Leistung kümmerten, aber über die Module hier (?) ... – Carsten
Einige mehr Details über den Unterschied zwischen den verschiedenen Falten: https://wiki.haskell.org/Foldr_Foldl_Foldl ' – ErikR
@ ErikR. Danke, ich habe das Wiki gelesen und AFAIU, 'foldl' wird fast nie benutzt. – dimid