
[redirecting from haskell-cafe to libraries]
On 3/13/07, Fritz Ruehr
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. * ...
On the other hand, I get the following on the (admittedly stupid, spur-of-the-moment) String argument "whateva":
Hugs> :l System.Random System.Random> read "whateva" :: StdGen
Program error: Prelude.read: no parse
System.Random> map read $ words "this is a test of the System dot Random StdGen read, which seems to fail only on ... whateva" :: [StdGen] [4580 1,440 1,101 1,4584 1,445 1,1485 1,35261 1,1377 1,32825 1,34047 1,13422 1,14037 1,13637 1,469 1,4132 1,4514 1,453 1,626 1, Program error: Prelude.read: no parse
Am I missing something here? Or am I just being punished for the stupidity of my particular choice of String? :)
You're being punished for using a string with more than six characters :-) I took a look at the code for System.Random; in particular, the Read instance for StdGen. If you look at the implementation of readsPrec in that instance, it clearly fails on any string longer than six characters that doesn't match [0-9]*[:space:][0-9]* (in that case, stdFromString is invoked, which consumes only the first six characters of the string, hence read says "no parse" if the input string has length greater than six). I'm not sure whether the code is wrong or whether the comment that says "It guarantees to succeed on any string." is wrong. (Or both.) Does anyone know? Cheers, Kirsten -- Kirsten Chevalier* chevalier@alum.wellesley.edu *Often in error, never in doubt "The blues isn't about feeling better, it's about making other people feel worse, and making a few bucks while you're at it." -- Bleeding Gums Murphy