[Haskell-cafe] Performance best practices
Bertram Felgenhauer
bertram.felgenhauer at googlemail.com
Sun Aug 4 06:43:14 UTC 2019
Todd Wilson wrote:
> For example, splits1 [1,2,3] is
> [([],[1,2,3]),([1],[2,3]),([1,2],[3]),([1,2,3],[])].
Note that `inits` (and hence `splits`) on lists is inherently quadratic,
because the resulting lists [1], [1,2], [1,2,3], and so on, cannot share
any parts of their spines. The only way around this is to change the
result, either the type (as suggested elsewhere in this list), or the
result itself. A cute option is to produce reversed lists, which can be
achieved by
rinits = scanl (flip (:)) []
(so `rinits [1,2,3] = [[],[1],[2,1],[3,2,1]]`). This works on plain
lists, and uses linear time and memory.
(One can view this as changing the result type to a list of snoc lists.
This fact can be expressed using a newtype wrapper or a custom list type
if desired.)
Cheers,
Bertram
More information about the Haskell-Cafe
mailing list