
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
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