Sergey
The essence of your message is that the H98 Random library
defn of randomR doesn't really make sense if the type does
not belong to Ord.
I don't want to specify that
| It is required randomR (lo,hi) g == randomR (hi,lo) g
as you suggest. That would be counter-intuitive for numbers.
How about this instead?
"If the element type 't' is not in class Ord, then the
author of the instance for Random t is responsible for
specifying
a) what "uniformly distributed" means
b) what subset of t is specified by the pair (lo,hi)
"
Simon
| -----Original Message-----
| From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
| Sent: 22 December 1999 20:17
| To: [EMAIL PROTECTED]
| Subject: suggestion for Random.randomR
|
|
| Suggestion for Haskell-2 library module Random.
|
|
| Haskell-98 declares
| --------------------------------------------------------------------
| class Random a where randomR :: RandomGen g => (a, a) -> g -> (a, g)
| ...
| ...
| instance Random Int where ...
| instance Random Integer where ...
| ...
| * randomR takes a range (lo,hi) and a random number generator g, and
| returns a random value
| > uniformly distributed in the closed interval [lo,hi],
| together with a new generator.
| > It is unspecified what happens if lo > hi.
| ...
| ---------------------------------------------------------------------
| - here i re-formatted the text and marked two lines with `>'.
|
|
| I suggest to change this ">" part to
|
| -- (h2) ----------------------------------------------------------
| ...
| "uniformly distributed" in the "closed interval" [lo,hi],
| together with a new generator.
| It is required randomR (lo,hi) g == randomR (hi,lo) g
| to hold for each g.
| "Uniformly distributed" means the usual notion for the "numeric"
| types Integer,Float,... - as well as for finite ones Bool,Char...
| Defining the Random instance for other types
| (say, T = (Random a, Random b) => (a,b) ),
| the programmer has to rely on one's own understanding of
| "uniform distribution" in domain T.
| Similar is the notion "closed interval [lo,hi]".
| For Integer, Float, ..., it is standard.
| For other domains T, maybe even not supplied with ordering, it
| means some subset in T defined by lo, hi :: T,
| this subset specification is on the programmer.
| ----------------------------------------------------------------
|
| I do not insist on this formulation literally.
| This is only the idea.
| Reason:
| the programmer could define, for example,
|
| instance (Random a, Random b) => Random (a,b) --instance (p)
| where
| randomR ((l,l'),(h,h')) g = case randomR (l,h) g of
|
| (a,g') -> case randomR (l',h') g' of (b,g'') -> ((a,b),g'')
|
| Then, the obstacles arise:
| (1) what does might mean "closed interval [lo,hi]" in (a,b) ?
| (2) applying instance (p) to, say, (Int,Int)
| may cause evaluation of randomR (l,h) g with l > h :: Int.
|
| The above suggestion (h2) provides some explanation for this.
|
| Personally, my aim was to provide random polynomials f :: P a
| over various coefficient domains `a', for the need of testing of
| some functions. And the format
| randomR (polynomial1,polynomial2) g
|
| derived from what Haskell-98 Random provides, looks useful to
| define random values inside various subsets of P a.
|
|
| ------------------
| Sergey Mechveliani
| [EMAIL PROTECTED]
|
|
|
|
|
|
|
|
|