[Haskell-beginners] Random variable holding a function

Daniel Bergey bergey at alum.mit.edu
Thu Feb 26 13:40:06 UTC 2015


On 2015-02-26 at 12:42, Ondrej Nekola <ondra at nekola.cz> wrote:
> 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.

There's no problem defining values of type `RVar (Population ->
Population`.  `fmap allSurvive` is one such.  But defining fairChance
this way seems a bit awkward to me.

Daniel


More information about the Beginners mailing list