A module containing the central type of the library, EventM
, and various
related helper functions.
- data EventM a
- makeEvent :: [a] -> EventM a
- makeEventProb :: (Ord a, Real prob) => [(a, prob)] -> EventM a
- outcomes :: Ord a => EventM a -> [(a, Rational)]
- enact :: EventM a -> IO a
- coinToss :: EventM Bool
- subst :: Eq a => a -> a -> EventM a -> EventM a
- compareEvent :: Ord a => EventM a -> EventM a -> Map Ordering Rational
Documentation
A probabilistic event with an outcome of type a
. See the enact
function
to actually run the event and randomly pick an outcome.
For an explanation of the Num
instance, see the DieRoll type in the Numeric.Probability.Game.Dice
module.
The Eq
instance compares the two distributions to see if they are equal.
This looks at all the outcomes and sees if their probabilities are equal on
the left-hand side and the right-hand side. For example,
coinToss == fmap (>= 4) d6
, but d12 /= d6 + d6
.
The Show
instance will display a horizontal bar-chart of relative outcome
probability. Note: this really is a relative probability -- common factors
are cancelled, and is not a count of the different outcomes. If you wish to
show the raw numbers, use show . outcomes
instead.
The Functor
instance allows you to modify the outcome values without changing
their associated probabilities. For example, fmap show d6
changes the outcomes
into their String representations.
The Applicative
instance allows you to join together the results of two events
in a predetermined manner. For example, makeEvent [id, (* 2)] <*> d6
allows
you to roll a d6 that has a 50% chance of being doubled. Note that pure
6
is an event that is certain to produce the outcome 6.
The Monad
instance allows you to base the choice of the next event on the
result of the previous event. For example, coinToss >>= x -> if x then d6
else d4
will roll a d4 50% of the time and a d6 the other 50%. Note that return
6
is an event that is certain to produce the outcome 6.
makeEvent :: [a] -> EventM aSource
Makes an event that has an equal chance of taking on the value of each
entry in the list. Note that duplicates in the list are permitted and do
have an effect: makeEvent [True, False]
has a 50% chance of giving a True
result, but makeEvent [True, True, False, False, False]
only has a 40%
chance of giving a True result. If you do not want this behaviour, use
makeEvent . nub
to remove duplicates.
The result of passing the empty list is undefined.
makeEventProb :: (Ord a, Real prob) => [(a, prob)] -> EventM aSource
Given a list of events and their associated probabilities, forms a corresponding event. The probabilities must be non-negative. If the probabilities do not sum to one, they are all scaled linearly so that their sum is one. Duplicate items will have their probabilities added.
The result of passing the empty list, a list containing negative probabilities, or a list where all the probabilities are zero is undefined.
outcomes :: Ord a => EventM a -> [(a, Rational)]Source
Gets a list of all the outcomes of the event and their associated probability. You can be sure that the probabilities will all sum to 1, and that there will only be one item in the list per outcome. It is possible that some of the outcomes in the list will have zero probability.
enact :: EventM a -> IO aSource
Actually enacts the event and produces a single result according to the probabilities
in the EventM a
parameter.
An event with a 50% chance of giving True, and a 50% chance of giving False.
subst :: Eq a => a -> a -> EventM a -> EventM aSource
If the EventM a
parameter returns a result equal to the first parameter,
it is changed to be the second parameter; otherwise it is left untouched. For
example replace 4 8 d4
has an equal chance of producing the outcomes 1, 2,
3 and 8, replace 10 0 d10 == z10
, and replace 10 20 d6 == d6
.
compareEvent :: Ord a => EventM a -> EventM a -> Map Ordering RationalSource
Compares the outcomes of the two events, and works out the probability associated with the first outcome being greater than, equal to or less than the second outcome. The probabilites for each are returned in an associative map.
Added in version 1.1.