unsafePerformIO and IORefs

Hal Daume III hdaume@ISI.EDU
Mon, 18 Nov 2002 10:36:05 -0800 (PST)


You can't.  CSE (common subexpression elimination) will replace any
occurances of 'newState 0' in a function body with the same value.

In short: don't use upIO :)

If I'm wrong, someone will correct me.  But expect a few "what are you
trying to do" email messages or people suggesting implicit paremeters or
monad wrappers (in fact, count this as the first of said emails).

 - Hal

--
Hal Daume III

 "Computer science is no more about computers    | hdaume@isi.edu
  than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume

On Mon, 18 Nov 2002, Nicolas Oury wrote:

> I want to write something like
> 
> type State a = IORef a
> 
> newState :: a -> State a
> newState v = unsafePerformIO (newIORef  v)
> 
> 
> But I don't want the compileer to inline this nor to inline any 
> application of this.
> 
> {#NOINLINE newState#}
> 
> But how can I stop this function to be inlined when applied for example :
> ....
> let x = newState 0 in
> {... code where x is used twice ...}
> 
> How to be sure that x isn't inlined and that all occurences of x are 
> pointing to the same memory place ?
> 
> Best regards,
> Nicolas Oury
> 
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users@haskell.org
> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
>