<div class="gmail_quote">2008/12/7 John Ky <span dir="ltr">&lt;<a href="mailto:newhoggy@gmail.com">newhoggy@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;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>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><br></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). 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><br></div><div>Also, as your application matures, you know your persistence layer is probably already done for you in Data.Binary :-)</div><div><br></div><div>Luke</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
<br>Thanks<br><font color="#888888"><br>-John</font><div><div></div><div class="Wj3C7c"><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>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">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>