<div>Okay, I get it now. Thanks to all of you for your quick replies!</div>
<div> </div>
<div>So, here&#39;s what I need to do:</div>
<ol>
<li>My Haskell code gets called by a higher level C function and asked to initialize itself.</li>
<li>As part of that initialization, I&#39;m expected to return a pointer to an instance of a particular data structure, which gets created/initialized in Haskell.</li>
<li>I create a stable pointer to a data structure instance, using <em>newStablePtr</em>, and return that pointer to the calling C function.</li>
<li>The same C function then, at a later time, calls a different function in my Haskell code, sending it that very same pointer, and expects that code to modify the data structure pointed to, in place.</li></ol>
<div>So, I wrote some code that looks like this:</div>
<blockquote style="MARGIN-RIGHT:0px" dir="ltr">
<div><font face="courier new,monospace">secondFunction :: StablePtr DataStructure -&gt; IO ()</font></div>
<div><font face="courier new,monospace">secondFunction dsPtr = do</font></div>
<div><font face="courier new,monospace">    ds &lt;- deRefStablePtr dsPtr</font></div>
<div><font face="courier new,monospace">    theRef &lt;- newIORef ds</font></div>
<div><font face="courier new,monospace">    writeIORef theRef newDs</font> </div></blockquote>
<div>which, of course, didn&#39;t work, because I didn&#39;t understand the true nature of IORef.</div>
<div> </div>
<div><strong>So, my question is: How do I do this? That is, how do I modify, in place, a data structure, which I originally created and made stable, using a pointer to that structure, which is being passed back to me, by the higher level C function that is calling me?</strong></div>

<div> </div>
<div>Thanks, all!</div>
<div>-db</div>
<div>
<div> </div>
<div>  </div></div>
<div class="gmail_quote">On Fri, Jun 22, 2012 at 8:43 AM, Max Rabkin <span dir="ltr">&lt;<a href="mailto:max.rabkin@gmail.com" target="_blank">max.rabkin@gmail.com</a>&gt;</span> wrote: 
<div> </div>
<blockquote style="BORDER-LEFT:#ccc 1px solid;MARGIN:0px 0px 0px 0.8ex;PADDING-LEFT:1ex" class="gmail_quote">
<div class="im">On Fri, Jun 22, 2012 at 5:30 PM, Captain Freako &lt;<a href="mailto:capn.freako@gmail.com">capn.freako@gmail.com</a>&gt; wrote: 
<div>&gt;  12 main = do</div>
<div>&gt;  13     let theValue = 1</div>
<div>&gt;  14     print theValue</div>
<div>&gt;  15     theValueRef &lt;- newIORef theValue</div>
<div>&gt;  16     bump theValueRef</div>
<div>&gt;  17     return theValue</div>
<div> </div>
<div> </div></div>theValue is a plain old immutable Haskell variable. &quot;newIORef&quot; creates 
<div>an IORef whose initial value is equal to the argument; it doesn&#39;t</div>
<div>create a pointer to the value or something like that. Change &quot;return</div>
<div>theValue&quot; to &quot;readIORef theValueRef&quot; to extract the changed value in</div>
<div>the IORef.</div>
<div><span class="HOEnZb"><font color="#888888"> </font></span></div><span class="HOEnZb"><font color="#888888">
<div>--Max</div>
<div></div></font></span> </blockquote></div>
<div> </div>