-- | 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[]

AltStyle によって変換されたページ (->オリジナル) /