<div dir="ltr">Okay, I figured the immutability bit out and I got the IORef example working, but I can&#39;t get it to work with state.<br><br>&gt; put (pureMT 0) &gt;&gt;= runRVar flipCoin<br><br>gives me two type errors: &quot;No instance for (MonadState PureMT m)&quot; and &quot;No instance for (RandomSource m ())&quot;<br>
<br>&gt; runState $ put (pureMT 0) &gt;&gt;= runRVar flipCoin<br>&gt; runState $ put (pureMT 0) &gt;&gt; get &gt;&gt;= runRVar flipCoin<br>&gt; put (pureMT 0) &gt;&gt; get &gt;&gt;= runRVar flipCoin<br><br>and other desperate attempts, some of which in hindsight are too embarrassing to list give me similar errors.  I&#39;m trying to do figure out how to do this without going to the IO monad (so I can run it with the same seed to replicate results).<br>
<br><div class="gmail_quote">On Tue, Sep 7, 2010 at 3:14 PM, James Andrew Cook <span dir="ltr">&lt;<a href="mailto:mokus@deepbondi.net">mokus@deepbondi.net</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
A PureMT generator is immutable, so must be threaded through the monad in which you are sampling.  There are RandomSource instances provided for a few special cases, including &quot;IORef PureMT&quot; in the IO monad.  For example:<br>

<br>
main = do<br>
    mt &lt;- newPureMT<br>
    src &lt;- newIORef mt<br>
    flips &lt;- runRVar (replicateM 20 flipCoin) src<br>
    print flips<br>
<br>
Alternatively, the functions in the module you mentioned can be used to define additional instances, such as:<br>
<br>
instance MonadRandom (State PureMT) where<br>
    supportedPrims _ _ = True<br>
    getSupportedRandomPrim = getRandomPrimFromPureMTState<br>
<br>
And RandomSource instances look almost the same.  See the Data.Random.Source.PureMT source for examples.  (I thought I had included this particular instance in the distribution but I apparently missed it.  The next release will probably include this as well as corresponding instances for the &#39;transformers&#39; package, possibly separated out into &#39;random-fu-mtl&#39; and &#39;random-fu-transformers&#39; packages).<br>

<br>
The &quot;StdRandom&quot; type is a convenient &quot;RandomSource&quot; designating this instance in the State PureMT monad.  Personally, I prefer to use the &quot;sample&quot; function for this purpose, as well as the &quot;sampleFrom&quot; function in place of runRVar/runRVarT.  GHCi does not display the &quot;sample&quot; functions&#39; types properly - they are defined for RVarT as well as for all Distribution instances.<br>

<br>
Sorry it took so long responding.<br>
<br>
-- James<br>
<div><div></div><div class="h5"><br>
On Sep 2, 2010, at 10:01 AM, Alex Rozenshteyn wrote:<br>
<br>
&gt; I seem to be having confusion at the runRVar level of random-fu.<br>
&gt;<br>
&gt; I can&#39;t figure out how to use the Data.Random.Source.PureMT module to get a meaningful random source (I can&#39;t get my code to type-check).<br>
&gt;<br>
&gt; I wrote a [trivial] flipCoin function<br>
&gt; &gt; flipCoin = uniform False True<br>
&gt; and am trying to fill in the final place of runRVar<br>
&gt; &gt; :t runRVar (replicateM 20 flipCoin)<br>
&gt; runRVar (replicateM 20 flipCoin)<br>
&gt;   :: (RandomSource m s) =&gt; s -&gt; m [Bool]<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt;           Alex R<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br>
</blockquote></div><br><br clear="all"><br>-- <br><div dir="ltr"><div>          Alex R</div></div><br>
</div>