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


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.


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


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


More information about the Libraries mailing list