Felipe Lessa wrote:
apfelmus wrote:
Of course, the solution is to first drop  n  elements and then take
tails instead of dropping  n  elements every time.

   map (drop n) . tails = tails . drop n

        O(m*n)                 O(m)

Nice identity. I'll remember this one.

Oops, please don't because it's wrong :)

  Data.List> let xs = [1..3]
  Data.List> map (drop 2) . tails $ xs
  [[3],[],[],[]]
  Data.List> tails . drop 2 $ xs
  [[3],[]]

The first one produces some extra empty lists at the end. In other words, the left hand side and the right hand side have different lengths

  length . map (drop n) . tails = (+1) . length

but

  length . tails . drop n = (\k -> 1 + max 0 (k-n)) . length

But the wrong version looks much nicer :)

Thanks for your great postings, apfelmus.
λ(^_^)λ

Regards,
apfelmus

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to