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