[Haskell-cafe] Mapping over multiple values of a list at once?

Bulat Ziganshin bulat.ziganshin at gmail.com
Thu Aug 27 08:01:19 EDT 2009


Hello Sebastiaan,

Thursday, August 27, 2009, 3:49:48 PM, you wrote:

you also need to replace (\d -> sum d `div` 3) with (`div` 3) . sum
in order to keep Haskell spirit :)


> 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_gergely at 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 at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe


-- 
Best regards,
 Bulat                            mailto:Bulat.Ziganshin at gmail.com



More information about the Haskell-Cafe mailing list