data StaV s a = StaF (s -> (s,a)) instance Functor (StaV s) where fmap f (StaF g) = StaF (\s -> let (s2,a) = g s in (s2, f a)) instance Applicative (StaV s) where pure a = StaF (\s -> (s,a)) StaF sf1 <*> StaF sf2 = StaF (\s -> let (s2, f) = sf1 s (s3, a) = sf2 s2 in (s3, f a)) instance Monad (StaV s) where (StaF sf1) >>= f = StaF (\s -> let (s2, a) = sf1 s StaF sf2 = f a (s3, b) = sf2 s2 in (s3, b)) get = StaF (\s -> (s,s)) set a = StaF (\s -> (a,())) run (StaF f) s = snd(f s) factS n = do set 1 mapM_ prinasob [1..n] res <- get return res prinasob x = do a <- get set $ a*x