Folks,
Thank you for lots of input on the random library.
If we can evolve a sensible proposal fast then we can put it
in Haskell 98.
I propose that we discuss this among the people who have already
contributed, rather than saturate the main Haskell list further.
The union of contributors is in the header of this message.
So to contribute further, just reply to the long list in the to-field
of this message (I havn't created a proper new mailing list).
Anyone else who wants to join in can send a message to that same list.
My own thoughts are below
Simon
==========================
Think of a RandomSupply as a value from which one can generate a lot
of pseudo random numbers.
data RandomSupply = ... -- abstract
A list of Ints is one concrete RandomSupply. So is a seed (such as
an Int or a pair of Ints). But a RandomSupply should jolly well be
abstract.
If it's abstract, what operations should be provided? Certainly things
such as
newRandomSupply :: IO RandomSupply
-- Consult the Dow Jones and
-- return an arbitrary supply
mkRandomSupply :: Int -> RandomSupply
-- Choose of of 2**31 pre-determined supplies
-- or (equivalently) map an Int into a supply
-- This is deterministic (of course) so you can
-- get predictable random numbers
mkRandom :: RandomSupply -> Double -- In range 0..1
mkRandomInt :: RandomSupply -> (Int,Int) -> Int
mkRandomInteger :: RandomSupply -> (Integer,Integer) -> Integer
-- and perhaps plural forms
mkRandoms :: RandomSupply -> [Double] -- In range 0..1
mkRandomInts :: RandomSupply -> (Int,Int) -> [Int]
mkRandomIntegers :: RandomSupply -> (Integer,Integer) -> [Integer]
nextRandomSupply :: RandomSupply -> RandomSupply
The interesting question is whether one should be able to split
a supply
splitRandomSupply :: RandomSupply -> (RandomSupply, RandomSupply)
I do think this is useful: consider a program that recurses over a tree,
and needs a random supply at the leaves. One can 'thread' the supply
but that linearises the program; better to split it.
All this is really very similar to Lennart's paper about conjuring
up unique identifiers[1].
So I have a question for the numerical people: can you implement
splitRandomSupply? It's easy to implement mkRandom/nextRandomSupply
using the standard pseudo-random number generators. But for split
we need to transform a seed into *two* seeds. The normal method
cycles through a large number of seeds in a long cycle. Generating
two seeds means picking two points in this long cycle rather than
just moving on one point at a time.
If someone could produce a convincing implementation for the signature
above I think it might do.
Comments about both the design and the implementation welcomed.
[1] Lennart Augustsson, Mikael Rittri, and Dan Synek.
Functional pearl: On generating unique names.
Journal of Functional Programming, 4(1):117-123, January 1994.