Or, when the list is infinite, turn it into a some neat but cryptic
State computation:
avgs = (:) <$> ((\d -> sum d `div` 3) <$> StateT (pure . splitAt 3))
<*> avgs
test = evalState avgs [1,2..]
--
Sebastiaan Visser
On Aug 27, 2009, at 11:19 AM, Eugene Kirpichov wrote:
How about this one? Should be pretty efficient.
let mavg n xs = let (sum -> seed,rest) = splitAt n xs in map (%n) .
scanl (\a (p,n) -> a+n-p) seed $ xs `zip` rest
2009/8/27 Patai Gergely <patai_gerg...@fastmail.fm>:
For example, starting from
[4,3,2,6,7]
you need to find the averages of
4,3,2 and 3,2,6 and 2,6,7
resulting in
[3,4,5]
What is the most elegant way to do that?
It's probably less elegant than tails, but very likely more
efficient to
keep track of running sums instead of summing the sublists over and
over
again.
import Data.Ratio
nsums n xs = map (% n) $ scanl (+) (sum (take n xs)) $ zipWith (-)
(drop
n xs) xs
Gergely
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe