Proposal: Generalize the RandomGen and Random classes
fox at ucw.cz
Wed Oct 6 19:10:22 EDT 2010
> > 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
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.
> 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  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 220.127.116.11.
> > Cheers,
> > Thomas
> >  http://hackage.haskell.org/trac/ghc/ticket/4315
More information about the Libraries