[Haskell-cafe] What are side effects in Haskell?

Brandon S. Allbery KF8NH allbery at ece.cmu.edu
Sat Dec 27 17:01:20 EST 2008

On 2008 Dec 27, at 15:16, Cristiano Paris wrote:
> On Sat, Dec 27, 2008 at 4:50 PM, Hans van Thiel  
> <hthiel.char at zonnet.nl> wrote:
>> However, some functions in Haskell may have side effects, like  
>> printing
>> something on the screen, updating a database, or producing a random
>> number. These functions are called 'actions' in Haskell.
> Functions may return "actions", which are a special kind of value even
> though they are no different to Haskell from values of any other type.

There is another way to think about it (which happens to also be the  
way GHC implements it):  an "action" is just a partially applied  
function.  In the case of IO, the missing value is the state, which  
has the opaque internal type RealWorld# that can't normally be  

(unsafePerformIO works by using an internal function which synthesizes  
a value of type RealWorld#.  Since all the IO code *and* the code  
generator in GHC assume this can't be done, unsafePerformIO is capable  
of confusing things rather badly.  In particular, you need to tell GHC  
to inline any code using unsafePerformIO because otherwise it can make  
incorrect assumptions and very strange behavior will result.   
UnsafeInterleaveIO is even sneakier:  it clones the hidden RealWorld#  
value, which brings its own kinds of confusion into the mix.)

In the normal course of events, your program becomes a long chain of  
unapplied functions (think foo. bar . baz . (...)), waiting for  
something to inject a RealWorld# into it.  This is the value of  
"main".  Conceptually, the runtime then injects a RealWorld# and the  
program runs.  (In reality, GHC knows that code doesn't actually have  
to be generated to carry RealWorld# values around, so the generated  
program ends up looking more or less normal.)

brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery at kf8nh.com
system administrator [openafs,heimdal,too many hats] allbery at ece.cmu.edu
electrical and computer engineering, carnegie mellon university    KF8NH

More information about the Haskell-Cafe mailing list