Inline.<br><br><div class="gmail_quote">On Mon, Dec 8, 2008 at 1:28 PM, Luke Palmer <span dir="ltr">&lt;<a href="mailto:lrpalmer@gmail.com">lrpalmer@gmail.com</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;">
<div class="gmail_quote">2008/12/7 John Ky <span dir="ltr">&lt;<a href="mailto:newhoggy@gmail.com" target="_blank">newhoggy@gmail.com</a>&gt;</span><div class="Ih2E3d"><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

Does that mean there is no place to store state while running the interpreter and that I have to put the state elsewhere such as a file?&nbsp; I was hoping to avoid that as I&#39;m only prototyping at this stage and don&#39;t want to write a persistent layer just yet.</blockquote>

<div><br></div></div><div>Bob is right, that technically it is unsafe. &nbsp;However, in GHC (I can&#39;t speak for the others) you can make it safe by forcing it not to inline. &nbsp;Then, IIRC, you are guaranteed (only in GHC, not in Haskell) that it will be only created once:</div>

<div><br></div><div>moo :: TVar Int</div><div>{-# NOINLINE moo #-}<br></div><div>moo = unsafePerformIO $ newTVarIO 1</div></div></blockquote><div><br>Will keep that in mind.<br>&nbsp;<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="gmail_quote"><div></div><div>Correct, you cannot have global state in safe Haskell. &nbsp;Make of that what you will, YMMV, personally I like it (it has positive implications in terms of semantics and reasoning). &nbsp;You have to put state elsewhere, but &quot;such as a file&quot; is a little extreme. &nbsp;Make it at the GHCi prompt (if there is more than a teeny bit of initialization, I usually define a helper function to make this as easy as possible).</div>
</div></blockquote><div><br>You mean like this?<br><br>Prelude&gt; x &lt;- GHC.Conc.atomically (GHC.Conc.newTVar 1)<br>Prelude&gt; GHC.Conc.atomically $ GHC.Conc.readTVar x<br>1<br><br>I could live with that.<br><br><br></div>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="gmail_quote"><div>Then pass it around or put your computation in a ReaderT (same thing). &nbsp;You&#39;re going to be passing it around when you write your real application anyway, right?</div>

<div></div></div></blockquote><div><br>Will need to read up on ReaderT.&nbsp; Thanks for the tip.<br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="gmail_quote"><div>Also, as your application matures, you know your persistence layer is probably already done for you in Data.Binary :-)</div><div></div></div></blockquote><div><br>Awesome.<br><br>&nbsp;Thanks<br>
<br>
-John<br>&nbsp;
<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="gmail_quote"><div>Luke</div><div><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="Ih2E3d">
<br>
<br>Thanks<br><font color="#888888"><br>-John</font><div><div></div><div><br><br><div class="gmail_quote">On Mon, Dec 8, 2008 at 11:51 AM, Thomas Davie <span dir="ltr">&lt;<a href="mailto:tom.davie@gmail.com" target="_blank">tom.davie@gmail.com</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;">
<div><div></div><div><br>
On 8 Dec 2008, at 01:28, John Ky wrote:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi,<br>
<br>
Is the following safe?<br>
<br>
moo :: TVar Int<br>
moo = unsafePerformIO $ newTVarIO 1<br>
<br>
I&#39;m interested in writing a stateful application, and I wanted to start with writing some IO functions that did stuff on some state and then test them over long periods of time in GHCi.<br>
<br>
I was worried I might be depending on some guarantees that aren&#39;t actually there, like moo being discarded and recreated inbetween invocations of different functions.<br>
</blockquote>
<br></div></div>
Define safe... In this case though, I would guess it&#39;s not safe. &nbsp;The compiler is free to call moo zero, one or many times depending on its evaluation strategy, and when it&#39;s demanded. &nbsp;It&#39;s possible that your TVar will get created many times, and different values returned by the &quot;constant&quot; moo.<br>



<br>
That sounds pretty unsafe to me.<br>
<br>
Bob<br>
</blockquote></div><br>
</div></div><br></div>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<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>
</blockquote></div><br>