On Wed, Nov 24, 2004 at 01:35:53AM -0500, Judah Jacobson wrote: > Very nice survey of practical applications! To futher clarify the > discussion, though, I'd like to note two distinct uses of > unsafePerformIO: > > 1) encapsulating referentially transparent IO actions into pure functions > 2) creating one-time-actions / top-level-mutable-variables / TWI's > > For example, in your example of Atom.hs, the top-level hashtable would > be #2, while the pure external interface is #1. I believe your post > addressed #2, please correct me if otherwise.
Ah yes, exactly. this is a very important point to bring up because the two uses are actually quite different in a fundamental way. #1 is safe-safe. in the fully safe meaning, as in all functional transformations one expects to be valid remain valid on a truely referentialy transparent pure function whether it is implemented internally with unsafePerformIO or not. This is exactly the proper use of unsafePerformIO. #2 unfortunatly, is the problem and I think the much more common use of unsafePerformIO because there does not exist another workaround in haskell for the top level initializer problem. It is an unsafe use of unsafePerformIO, meaning there are generally valid language transformations which change the meaning of programs using it and the fact it has worked so well is just a coincidence of implementation. The reason I only addressed #2 is because it is the only one that actually has a technical problem that needs to be addressed :) Part of my current interest in #2 is that I have been experimenting with some full-program optimization algorithms which could perhaps give substantial gains but would pretty much obliterate any uses of the unsafePerformIO global variable hack, and no pragma can save them. Before this, I never realized just how uncorrect the global variable use of unsafePerformIO was :) Thinking about this problem and realizing there is no in-language solution without giving up certain key optimizations is what originally motivated my previous concrete proposal based on the 'mdo' semantics. John -- John Meacham - ârepetae.netâjohnâ _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell