Proposal: Generalize the RandomGen and Random classes

Milan Straka fox at ucw.cz
Wed Oct 6 19:10:22 EDT 2010


Hi,

> Milan:
> > I personally do not think it is worth to modify the Random module, which
> > dates back to at least Haskell 98. Maybe a new package on the Hackage?
> 
> So because it is old we can't modify it?  The point of changing the
> library is to benefit a broader portion of the community.  We could
> stop any and all changes to package X and make a new package every
> time but this isn't a sufficient argument to me.
> 
> If peoples only objections are compatibility then we can queue this
> change up with the next API breaking change, unless there will never
> again be such a change.

I do not object to a change, but as I said in the paragraph above the cited
one, I do not see much benefit (so I consider breaking this code
a bigger issue than gain from accepting it).

Let me repeat my question:
- what other types than Int do you have in mind? (also asked by Antoine
  Latter)
It seems to me that bits can be trivially converted to Ints.

Personally I also do not like Functional dependencies very much. I would
rather be in favor of type families, as SPJ suggested.

Cheers,
Milan

> 
> Cheers,
> Thomas
> 
> 
> On Tue, Sep 14, 2010 at 5:11 PM, Thomas DuBuisson
> <thomas.dubuisson at gmail.com> wrote:
> > Hello,
> > RandomGen and Random classes assume generators produce Int values.
> > This is non-ideal as many high speed generators produce special values
> > (ex: doubles) or generic values (bit streams / bytestrings) that can
> > be converted directly to types easier than coercing to Int then to an
> > 'a' via the Random class.
> >
> > See 4315 [1] for the patch.
> >
> > Period of discussion: Till October 8 (3.5 weeks, giving a little time
> > after ICFP for last minute debate)
> >
> > Specifically, this proposal:
> >
> > 1) Alters RandomGen:
> >
> > from:
> >  class RandomGen g where
> >      next :: g -> (Int, g)
> >      genRange :: g -> (Int, Int)
> >
> > to
> >
> > class RandomGen g v | g -> v where
> >    next :: g -> (v, g)
> >    genRange :: g-> (v,v)
> >
> > 2) Alters Random:
> >
> > From:
> >
> > class Random a where
> >  randomR :: RandomGen g => (a,a) -> g -> (a,g)
> >  random  :: RandomGen g => g -> (a, g)
> >  randomRs :: RandomGen g => (a,a) -> g -> [a]
> >  randoms  :: RandomGen g => g -> [a]
> >  randomRIO :: (a,a) -> IO a
> >  randomIO  :: IO a
> >
> > to
> >
> > class Random a where
> >  randomR :: RandomGen g v => (a,a) -> g -> (a,g)
> >  random  :: RandomGen g v => g -> (a, g)
> >  randomRs :: RandomGen g v => (a,a) -> g -> [a]
> >  randoms  :: RandomGen g v => g -> [a]
> >
> >
> > Additional Points of Debate
> > 1) Because random[R]IO can not be part of the new Random instance with
> > a sensible default, these have been moved to top-level functions:
> >
> >  randomRIO :: (Random a Int) => (a,a) -> IO a
> >  randomIO  :: (Random a Int) => IO a
> >
> > Other options exist and I'm open to them.  I'm just being upfront
> > about what the patch currently does.
> >
> > 2) All pre-existing instances of "Random x" for some concrete 'x' have
> > been modified to be "instance Random x Int".  As 'Int' was the
> > previous (hardcoded) default for RandomGen this is simply matching the
> > behavior.  More instances are possible and probably make sense now.
> > Alternatively, one could argue for zero default instance as they can
> > collide with how a particular user wishes types to be coerced.
> >
> > 3) Not-so-new extensions are used to enable these changes.  Extensions
> > include MultiParamTypeClasses, FlexibleContexts, and FunDeps.
> >
> > 4) A patch is included bumping the version from 1.0.0.x to 1.1.0.0.
> >
> > Cheers,
> > Thomas
> >
> > [1] http://hackage.haskell.org/trac/ghc/ticket/4315
> >
> 


More information about the Libraries mailing list