Averages/Simple moving average: Difference between revisions

Content added Content deleted
m ({{out}})
No edit summary
Line 1,393: Line 1,393:
printSMA n p = mapM_ (\(n,a) -> putStrLn $ "Next number: " ++ show n ++ " Average: " ++ show a)
printSMA n p = mapM_ (\(n,a) -> putStrLn $ "Next number: " ++ show n ++ " Average: " ++ show a)
. take n . sMA p $ [1..5]++[5,4..1]++[3..]</lang>
. take n . sMA p $ [1..5]++[5,4..1]++[3..]</lang>

Stateful function using the state monad to keep track of state

{{works with|GHC|7.8.3}}
<lang Haskell>
import Control.Monad
import Control.Monad.State

period :: Int
period = 3

type SMAState = [Float]

computeSMA :: Float -> State SMAState Float
computeSMA x = do
previousValues <- get
let values = previousValues ++ [x]
let newAverage = if length values <= period then (sum values) / (fromIntegral $ length remainingValues :: Float)
else (sum remainingValues) / (fromIntegral $ length remainingValues :: Float)
where remainingValues = dropIf period values
put $ dropIf period values
return newAverage

dropIf :: Int -> [a] -> [a]
dropIf x xs = drop ((length xs) - x) xs

demostrateSMA :: State SMAState [Float]
demostrateSMA = mapM computeSMA [1, 2, 3, 4, 5, 5, 4, 3, 2, 1]

main :: IO ()
main = putStrLn $ (show result)
where
(result, _) = runState demostrateSMA []
</lang>

outputs:
<pre>
[1.0,1.5,2.0,3.0,4.0,4.6666665,4.6666665,4.0,3.0,2.0]
</pre>


=={{header|HicEst}}==
=={{header|HicEst}}==