
Hi 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. I have a following code (simplified to make email more readable): import Data.List import Data.Functor import Genes import Data.Random.RVar import Data.Random.Extras data Individual = Individual (Int, Int) deriving (Eq, Show) -- this part is a bit more complicated... data Population = Population { individuals :: [Individual] } deriving (Eq, Show) type Selection = Population -> Population so far, it's easy: allSurvive :: Selection allSurvive = id extinction :: Selection extinction _ = Population [] The issue comes, when I want to have some randomness in the process. I am able to write a "pick some individuals into next generation" sort of "Selection" fairChance :: Int -> Population -> RVar Population fairChance newSize p = Population <$> (Data.Random.Extras.sample newSize $ individuals p) But it obviously doesn't fit into the "Selection" type. I would like to have something like 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? Thanks Ondrej