Averages/Simple moving average: Difference between revisions

→‎{{header|Haskell}}: reformulated mean calculation with foldl' and strict pair in first example
(→‎{{header|Lua}}: variable period, f renamed to sum and simplified)
(→‎{{header|Haskell}}: reformulated mean calculation with foldl' and strict pair in first example)
Line 1,572:
Conform version to the requirement, function SMA called multiple times with just a number:
{{works with|GHC|6.10.4}}
<lang Haskell>import{-# Control.MonadLANGUAGE BangPatterns #-}
 
import Control.Monad
import Data.List
import Data.IORef
 
data Pair a b = Pair !a !b
 
mean :: Fractional a => [a] -> a
mean = divl . foldl' (\(Pair s l) x -> Pair (s+x) (l+1)) (Pair 0.0 0)
mean xs = sum xs / (genericLength xs)
where divl (_,0) = 0.0
divl (s,l) = s / fromIntegral l
 
series = [1,2,3,4,5,5,4,3,2,1]
 
mkSMA :: Int -> IO (Double -> IO Double)
simple_moving_averager period = do
mkSMA period numsRef= avgr <-$> newIORef []
where avgr nsref x = readIORef nsref >>= (\ns ->
return (\x -> do
numslet <-xs readIORef= numsReftake period (x:ns)
letin xswriteIORef =nsref takexs period$> (x:numsmean xs)
writeIORef numsRef xs
return $ mean xs
)
 
main = mkSMA 3 >>= (\sma3 -> mkSMA 5 >>= (\sma5 ->
main = do
mapM_ (str <$> pure n <*> sma3 <*> sma5) series))
sma3 <- simple_moving_averager 3
where str n mm3 mm5 =
sma5 <- simple_moving_averager 5
concat putStrLn $ ["Next number = " ++ (,show n) ++ ,", SMA_3 = " ++ (,show mm3) ++ ,", SMA_5 = " ++ (,show mm5)]</lang>
forM_ series (\n -> do
mm3 <- sma3 n
mm5 <- sma5 n
putStrLn $ "Next number = " ++ (show n) ++ ", SMA_3 = " ++ (show mm3) ++ ", SMA_5 = " ++ (show mm5)
)</lang>
{{out}}
<pre>Next number = 1.0, SMA_3 = 1.0, SMA_5 = 1.0
Line 1,652 ⟶ 1,651:
 
main :: IO ()
main = putStrLnprint $ (showevalState result)demostrateSMA []
where
(result, _) = runState demostrateSMA []
</lang>
 
Anonymous user