
Daniel Bergey wrote:
On 2015-02-26 at 12:42, Ondrej Nekola
wrote: I try to simulate some processes, that contain randomness and I would like do it idiomatic way and keep as much code not to know about randomness as possible.
type Selection = Population -> Population
so far, it's easy:
allSurvive :: Selection allSurvive = id
fairChance :: Int -> Population -> RVar Population fairChance newSize p = Population <$> (Data.Random.Extras.sample newSize $ individuals p)
fairChance :: Int -> RVar Selection (e.g. fairChance :: Int -> RVar (Population -> Population))
Is there a way to do this? Or should I give up this way and try to give up some purity and go withtype Selection :: RVar Population -> RVar population?
I would define Selection as
| type Selection = Population -> RVar Population
Then you can compose with >>=, which specializes to
| (>>=) :: RVar Population -> Selection -> RVar Population
or with any of the other Monad operators (eg, >=>).
With this definition, you can keep your current definition of fairChance.
This is pretty much the "probability monad". For more on this, my personal recommendations would be http://apfelmus.nfshost.com/articles/random-permutations.html http://web.engr.oregonstate.edu/~erwig/papers/PFP_JFP06.pdf Best regards, Heinrich Apfelmus -- http://apfelmus.nfshost.com