[Haskell-cafe] What are side effects in Haskell?
frodo at theshire.org
Sat Dec 27 15:16:12 EST 2008
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.
No :D I'll try to explain using the same picture that came into my
mind when I first got what monads really are...
Everything in Haskell is a function AND an Haskell function is always
pure, i.e. has no side effects.
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.
When you are returning an action is like when you go to a driver and
give him a car: the driver takes the car you gave him and takes it
wherever the car is supposed to go. You build the car using small
pieces (i.e. basic functions returning actions like putStrLn) and
putting everything together using combinators (like >>= and >> or the
So, the car in the example is an "action" (or, more formally, a value
in a monad). Your Haskell functions (like putStrLn or anything) just
return the car, but they don't run it: they are run at run-time by the
Haskell run-time environment whose only task is to run values in the
IO Monad, i.e. running the car.
Even it may not be apparent for the IO Monad, every Monad value is run
at some point in time: almost every monad is associated to at least a
function running the monad: for the State Monad this is runState, for
the Reader Monad is runReader and so on.
The only exception to this is the IO Moand, which can be run only by
the Haskell run time, implicitly: this is the reason why you'll never
see a "runIO" thing.
When the monad is run, it generate side-effects, like printing to
screen, opening file and so on.
If you're used to Unix administration, another image to understand
monads are scripts. Haskell functions return script files that are run
by the shell to affect the system they are run on. In the end, they
are small pieces (the basic commands present in the system) put
together by bash constructs, like "for", "while" and so on.
Hope this helps.
More information about the Haskell-Cafe