-- | Monad helper functionsmoduleNumeric.Probability.MonadwhereimportControl.Monad.HT((<=<),)importControl.Monad(liftM,)importPreludehiding(iterate,)-- | composition of a list of monadic functionscompose ::Monadm =>[a ->m a ]->a ->m a compose :: forall (m :: * -> *) a. Monad m => [a -> m a] -> a -> m a compose =forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl(forall a b c. (a -> b -> c) -> b -> a -> c flipforall (m :: * -> *) b c a. Monad m => (b -> m c) -> (a -> m b) -> a -> m c (<=<))forall (m :: * -> *) a. Monad m => a -> m a returniterate ::Monadm =>Int->(a ->m a )->(a ->m a )iterate :: forall (m :: * -> *) a. Monad m => Int -> (a -> m a) -> a -> m a iterate Int n a -> m a f =forall (m :: * -> *) a. Monad m => [a -> m a] -> a -> m a compose forall a b. (a -> b) -> a -> b $forall a. Int -> a -> [a] replicateInt n a -> m a f -- | like 'iterate' but returns all intermediate values-- like Control.Monad.HT.iterateLimit, but counts differently.-- Is it actually useful this way?walk ::(Monadm )=>Int->(a ->m a )->(a ->m [a ])walk :: forall (m :: * -> *) a. Monad m => Int -> (a -> m a) -> a -> m [a] walk Int n a -> m a f =letrecourse :: t -> a -> m [a] recourse t 0a _=forall (m :: * -> *) a. Monad m => a -> m a return[]recourse t m a x =forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM(a x forall a. a -> [a] -> [a] :)(t -> a -> m [a] recourse (forall a. Enum a => a -> a predt m )forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<<a -> m a f a x )inforall {t}. (Eq t, Num t, Enum t) => t -> a -> m [a] recourse Int n {- | While loop with a posteriori check. Loops at least once. -}doWhile ::Monadm =>(a ->Bool)->(a ->m a )->(a ->m a )doWhile :: forall (m :: * -> *) a. Monad m => (a -> Bool) -> (a -> m a) -> a -> m a doWhile a -> Bool p a -> m a t =letrecourse :: a -> m a recourse a x =a -> m a t a x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>=\a l ->ifa -> Bool p a l thena -> m a recourse a l elseforall (m :: * -> *) a. Monad m => a -> m a returna l ina -> m a recourse {- | While loop with a priori check. Can loop zero times. -}while ::Monadm =>(a ->Bool)->(a ->m a )->(a ->m a )while :: forall (m :: * -> *) a. Monad m => (a -> Bool) -> (a -> m a) -> a -> m a while a -> Bool p a -> m a t =letrecourse :: a -> m a recourse a x =ifa -> Bool p a x thena -> m a t a x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>=a -> m a recourse elseforall (m :: * -> *) a. Monad m => a -> m a returna x ina -> m a recourse whileTrace ::Monadm =>(a ->m Bool)->m a ->m [a ]whileTrace :: forall (m :: * -> *) a. Monad m => (a -> m Bool) -> m a -> m [a] whileTrace a -> m Bool p m a t =doa x <-m a t Bool b <-a -> m Bool p a x forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM(a x forall a. a -> [a] -> [a] :)forall a b. (a -> b) -> a -> b $ifBool b thenforall (m :: * -> *) a. Monad m => (a -> m Bool) -> m a -> m [a] whileTrace a -> m Bool p m a t elseforall (m :: * -> *) a. Monad m => a -> m a return[]