<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">OK, I think what you're saying is to work with (random) integers and use fromEnum and toEnum to get corresponding DayOfWeek. But I get this when I try to use toEnum:<br><br>[michael@localhost ~]$ ghci dow<br>GHCi, version 6.10.1: http://www.haskell.org/ghc/&nbsp; :? for help<br>Loading package ghc-prim ... linking ... done.<br>Loading package integer ... linking ... done.<br>Loading package base ... linking ... done.<br>[1 of 1] Compiling Main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( dow.hs, interpreted )<br>Ok, modules loaded: Main.<br>*Main&gt; fromEnum Wednesday<br>Loading package old-locale-1.0.0.1 ... linking ... done.<br>Loading package old-time-1.0.0.1 ... linking ... done.<br>Loading package random-1.0.0.1 ... linking ... done.<br>2<br>*Main&gt; toEnum 2<br>*** Exception: Prelude.Enum.().toEnum: bad argument<br>*Main&gt;
 <br><br>Michael<br><br>--- On <b>Fri, 5/1/09, John Van Enk <i>&lt;vanenkj@gmail.com&gt;</i></b> wrote:<br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: John Van Enk &lt;vanenkj@gmail.com&gt;<br>Subject: Re: [Haskell-cafe] Generating random enums<br>To: "michael rice" &lt;nowgate@yahoo.com&gt;<br>Cc: haskell-cafe@haskell.org<br>Date: Friday, May 1, 2009, 12:36 PM<br><br><div id="yiv201743860"><div>When you derive Enum, you get fromEnum and toEnum for free. You don't need your dow2Int stuff or int2Dow. Replace those with fromEnum and toEnum respectively.</div>
<div>&nbsp;</div>
<div>/jve<br><br></div>
<div class="gmail_quote">On Fri, May 1, 2009 at 12:26 PM, michael rice <span dir="ltr">&lt;<a rel="nofollow" ymailto="mailto:nowgate@yahoo.com" target="_blank" href="/mc/compose?to=nowgate@yahoo.com">nowgate@yahoo.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0px 0px 0px 0.8ex; padding-left: 1ex;">
<table border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td valign="top">I'm using the code below to generate random days of the week [Monday..Sunday].<br><br>Is there a better/shorter way to do this?<br><br>Michael<br><br>==============<br><br>[michael@localhost ~]$ ghci dow<br>
GHCi, version 6.10.1: <a rel="nofollow" target="_blank" href="http://www.haskell.org/ghc/">http://www.haskell.org/ghc/</a>&nbsp; :? for help<br>Loading package ghc-prim ... linking ... done.<br>Loading package integer ... linking ... done.<br>
Loading package base ... linking ... done.<br>[1 of 1] Compiling Main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( dow.hs, interpreted )<br>Ok, modules loaded: Main.<br>*Main&gt; random (mkStdGen 100) :: (DayOfWeek, StdGen)<br>Loading package old-locale-1.0.0.1 ... linking ... done.<br>
Loading package old-time-1.0.0.1 ... linking ... done.<br>Loading package random-1.0.0.1 ... linking ... done.<br>(Friday,4041414 40692)<br>*Main&gt; random (mkStdGen 123) :: (DayOfWeek, StdGen)<br>(Tuesday,4961736 40692)<br>
*Main&gt;<br><br>==============<br><br>import System.Random<br><br>data DayOfWeek<br>&nbsp;&nbsp;&nbsp; = Monday<br>&nbsp;&nbsp;&nbsp; | Tuesday<br>&nbsp;&nbsp;&nbsp; | Wednesday<br>&nbsp;&nbsp;&nbsp; | Thursday<br>&nbsp;&nbsp;&nbsp; | Friday<br>&nbsp;&nbsp;&nbsp; | Saturday<br>&nbsp;&nbsp;&nbsp; | Sunday<br>&nbsp;&nbsp;&nbsp; deriving (Show, Read, Eq, Enum, Ord, Bounded)<br>
<br>instance Random DayOfWeek where<br>&nbsp; randomR (a,b) g = <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case (randomIvalInteger (toInteger (dow2Int a), toInteger (dow2Int b)) g) of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (x, g) -&gt; (int2Dow x, g)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dow2Int Monday&nbsp;&nbsp;&nbsp; = 0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dow2Int Tuesday&nbsp;&nbsp; = 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dow2Int Wednesday = 2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dow2Int Thursday&nbsp; = 3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dow2Int Friday&nbsp;&nbsp;&nbsp; = 4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dow2Int Saturday&nbsp; = 5<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dow2Int Sunday&nbsp;&nbsp;&nbsp; = 6<br><br>&nbsp;&nbsp; &nbsp; int2Dow 0&nbsp;&nbsp; &nbsp;= Monday<br>
&nbsp;&nbsp; &nbsp; int2Dow 1&nbsp;&nbsp; &nbsp;= Tuesday<br>&nbsp;&nbsp; &nbsp; int2Dow 2&nbsp;&nbsp; &nbsp;= Wednesday<br>&nbsp;&nbsp; &nbsp; int2Dow 3&nbsp;&nbsp; &nbsp;= Thursday<br>&nbsp;&nbsp; &nbsp; int2Dow 4&nbsp;&nbsp; &nbsp;= Friday<br>&nbsp;&nbsp; &nbsp; int2Dow 5&nbsp;&nbsp; &nbsp;= Saturday<br>&nbsp;&nbsp; &nbsp; int2Dow 6&nbsp;&nbsp; &nbsp;= Sunday<br><br>&nbsp; random g&nbsp;&nbsp; &nbsp;&nbsp; = randomR (minBound,maxBound) g<br>
<br>randomIvalInteger :: (RandomGen g, Num a) =&gt; (Integer, Integer) -&gt; g -&gt; (a, g)<br>randomIvalInteger (l,h) rng<br>&nbsp;| l &gt; h&nbsp;&nbsp;&nbsp;&nbsp; = randomIvalInteger (h,l) rng<br>&nbsp;| otherwise = case (f n 1 rng) of (v, rng') -&gt; (fromInteger (l + v `mod` k), rng')<br>
&nbsp;&nbsp;&nbsp;&nbsp; where<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k = h - l + 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = 2147483561<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = iLogBase b k<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f 0 acc g = (acc, g)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f n acc g = <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (x,g')&nbsp;&nbsp; = next g<br>&nbsp;&nbsp; &nbsp;&nbsp; in<br>&nbsp;&nbsp; &nbsp;&nbsp; f (n-1) (fromIntegral x + acc * b) g'<br>
<br>iLogBase :: Integer -&gt; Integer -&gt; Integer<br>iLogBase b i = if i &lt; b then 1 else 1 + iLogBase b (i `div` b)<br><br><br><br>&nbsp;<br><br></td></tr></tbody></table><br><br>_______________________________________________<br>
Haskell-Cafe mailing list<br><a rel="nofollow" ymailto="mailto:Haskell-Cafe@haskell.org" target="_blank" href="/mc/compose?to=Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br><a rel="nofollow" target="_blank" href="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br><br clear="all">
<div></div><br>-- <br>/jve<br>
</div></blockquote></td></tr></table><br>