"Learn You A Haskell"とchapter about modulesには、リストにサブリストが含まれているかどうかを調べるsearchという名前の関数の定義があります。haskellでfoldlの代わりにfoldrを使う
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
この章で述べたfoldl'
を使用しない理由は今、私は疑問に思う、と速く走る:小さな調整で、私たちも扱うことができるfoldr
を使用することができ、
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)
いっそ短絡による無限リスト。 isInfixOf
のdefinitionを見ると
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
、私はfoldr
を使用する、any
で実装されます参照してください。
この場合、何か不足していますか、それともfoldr
を使用する方が良いですか?
これはおそらく、著者はパフォーマンスについては気にしなかったが、ここではモジュールについて...? – Carsten
さまざまなフォールドの違いについての詳細:https://wiki.haskell.org/Foldr_Foldl_Foldl ' – ErikR
@ ErikR。ありがとう、私はwikiを読んで、AFAIU、 'foldl'はほとんど使用されていません。それは長いリスト上の固有の低性能を有するため、 – dimid