2 Connection to stochastics

There is some correspondence between notions in programming and in mathematics:

random generator

~

random variable / probabilistic experiment

result of a random generator

~

outcome of a probabilistic experiment

Thus the signature

rx ::(MonadRandom m, Random a)=> m a

can be considered as "

rx

is a random variable". In the do-notation the line

x <- rx

means that "

x

is an outcome of

rx

".

In a language without higher order functions and using a random
generator "function" it is not possible to work with random variables, it
is only possible to compute with outcomes, e.g. rand()+rand(). In a
language where random generators are implemented as objects, computing
with random variables is possible but still cumbersome.

In Haskell we have both options either computing with outcomes

do x <- rx
y <- ry
return(x+y)

or computing with random variables

liftM2 (+) rx ry

This means that

liftM

like functions convert ordinary arithmetic into

random variable arithmetic. But there is also some arithmetic on random
variables which can not be performed on outcomes. For example, given a
function that repeats an action until the result fulfills a certain
property (I wonder if there is already something of this kind in the
standard libraries)