[Haskell-cafe] Re: Sequence differences

Henning Thielemann lemming at henning-thielemann.de
Fri Apr 10 19:52:47 EDT 2009


On Fri, 10 Apr 2009, Chad Scherrer wrote:

> A nice generalization of this that can be really useful is
>
> movingWindow :: Int -> [a] -> [[a]]
> movingWindow 1 xs = map (:[]) xs
> movingWindow n xs = zipWith (:) xs . tail $ movingWindow (n-1) xs
>
> So for example,
>
>> movingWindow 3 [1..10]
> [[1,2,3],[2,3,4],[3,4,5],[4,5,6],[5,6,7],[6,7,8],[7,8,9],[8,9,10]]


movingWindow n xs =
    take (length xs - n +1) $ map (take n) $ tails xs

or more efficient using utility-ht package:

movingWindow n xs =
    Data.List.Match.take (drop (n-1) xs) $
       map (take n) $ tails xs


> Then you can write
>
> diff :: (Num a) => [a] -> [a]
> diff = map (\[x,y] -> y - x) . movingWindow 2
>
> Hopefully the intermediate lists are optimized away, but I haven't done any
> performance testing.

I'm not sure. You are safer and more efficient when you restrict to pairs. 
Since I often need the function, I defined:
   http://hackage.haskell.org/packages/archive/utility-ht/0.0.4/doc/html/Data-List-HT.html#v%3AmapAdjacent

Then
   diff = mapAdjacent subtract


More information about the Haskell-Cafe mailing list