
Btw, if you don't want the empty lists, you can use
concatMap (init . tails) . tail . inits
Would it not be more efficient and perspicuous to keep the sublists definition as is, just interchanging inits and tails? where sublists = filter (not . null) . concatMap tails . inits Or am I missing some argument about sublist sharing? Dan Bertram Felgenhauer wrote:
J. Garrett Morris wrote:
-- the tails function returns each tail of the given list; the inits function -- is similar. By mapping inits over tails, we get all the sublists. where sublists = filter (not . null) . concatMap inits . tails
Nice, but
concatMap tails . inits
is much better in my opinion, for several reasons:
- inits is expensive (O(n^2)) while tails is cheap (O(n)), so it's better to use inits only once. - the result lists of inits can't be shared (which is essentially the reason why it's so expensive); tails shares the common part of the result lists. - finally, concatMap tails . inits works nicely with infinite lists, with every substring occuring in the result eventually
Btw, if you don't want the empty lists, you can use
concatMap (init . tails) . tail . inits
Bertram