
On Mon, May 18, 2009 at 10:13 PM, Brandon S. Allbery KF8NH
On May 19, 2009, at 01:07 , z_axis wrote:
rollDice_t n = do hd <- openFile "/dev/random" ReadMode v <- B.hGet hd 1 return (v `mod` n) + 1
No instance for (Integral B.ByteString)
You can't just read a binary string and have it interpreted as a number; you want to use Data.Binary to extract an Int (or whatever) from the ByteString. The same would apply with legacy Strings; in Haskell, String, ByteString, and Int are distinct types and there is no automatic casting. In fact I'm not quite sure why you thought that should work; even Perl would make you unpack(), and C would require you to use an appropriately-aligned buffer and unsafely cast the (char *) to an (int *).
More so, you appear to only be getting one byte from your random number source, so that really limits the range of numbers this function can produce. Also, the error you are getting is more to do with ambigious types because there is a typeclass implied and you didn't add any type annotations yourself. Suggestions: 1) Use Data.ByteString.Lazy 2) Read the file, and don't forget to close it - or rework how you intend to get randoms (a better solution!) 3) Use 'decode' form Data.Binary and add a type signature to get an Int, Word32, or some such. 4) Apply mod and return Thomas