
Everything in Haskell is a function [...]
Where did this idea come from?
I'd say every expression in Haskell denotes a pure value, only some of which
are functions (have type a->b for some types a & b).
- Conal
On Sat, Dec 27, 2008 at 12:16 PM, Cristiano Paris
On Sat, Dec 27, 2008 at 4:50 PM, Hans van Thiel
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 "do" notation).
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.
-- Cristiano _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe