[Haskell-beginners] Is there an "unscan" function?

Stephen Tetley stephen.tetley at gmail.com
Fri Jan 13 19:19:49 CET 2012

Hi Jeffrey

My version actually contains an error, it should be:

unscan :: (a -> a -> b) -> [a] -> [b]
unscan f (a:b:bs) = f a b : unscan f (b:bs)
unscan _ _        = []

A slightly less concise, but optimized version avoids putting the
second element back in a list:

unscan f (a:b:bs) = f a b : go b bs
    go _ [] = []
    go x (z:zs) = f x z : go z zs
unscan _ _        = []

The first mention of "speed" for traversing lists at different rates
I've seen was in the paper "There and Back Again" by Olivier Danvy and
Mayer Goldberg.


Best wishes


More information about the Beginners mailing list