[Haskell-cafe] System.Random StdGen read fails on some strings?
Ian Lynagh
igloo at earth.li
Tue Mar 13 19:06:16 EDT 2007
On Tue, Mar 13, 2007 at 01:19:35AM -0700, Kirsten Chevalier wrote:
> [redirecting from haskell-cafe to libraries]
>
> On 3/13/07, Fritz Ruehr <fruehr at willamette.edu> wrote:
> >
> >According to the documentation for System.Random (see
> ><http://haskell.org/ghc/docs/latest/html/libraries/base/System-Random.html>):
> >
> >In addition, read may be used to map an arbitrary string (not necessarily
> >one produced by show) onto a value of type StdGen. In general, the read
> >instance of StdGen has the following properties:
> >
> >
> > * It guarantees to succeed on any string.
> > * ...
This comes from the report:
http://haskell.org/onlinereport/random.html
The next bullet point is
* It guarantees to consume only a finite portion of the string.
Suppose we are only ever going to consume 6 characters. What should
(reads :: ReadS StdGen) "1234567" return? There are three possibilities:
[(<something>, "")]
[(<something>, "7")]
[(<something>, ""), (<something>, "7")]
I would say that the first makes most sense.
However,
(reads :: ReadS (StdGen, Int)) (show (myStdGen, 5))
ought to work, i.e. if we are reading what look like a shown stdgen then
we should give the remainder of the string, otherwise we shouldn't.
This would just mean changing
stdFromString s = (mkStdGen num, rest)
to
stdFromString s = (mkStdGen num, "")
Also, the reading-a-shown-stdgen code
(s1, r1) <- readDec (dropWhile isSpace r)
(s2, r2) <- readDec (dropWhile isSpace r1)
return (StdGen s1 s2, r2)
doesn't satisfy "guarantees to consume only a finite portion of the
string". We could fix that by first splitting off the first n
characters, doing the read on that and then putting it back together
again. I think n should be this many:
" (StdGen (-18446744073709551616) (-18446744073709551616))"
Thanks
Ian
More information about the Libraries
mailing list