> 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 _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe