[Haskell-cafe] Functions with side-effects?
Creighton Hogg
wchogg at login01.hep.wisc.edu
Wed Dec 21 07:15:17 EST 2005
On Wed, 21 Dec 2005, Daniel Carrera wrote:
> Hi all,
>
> I'm a Haskell newbie and I don't really understand how Haskell deals
> with functions that really must have side-effects. Like a rand()
> function or getLine().
>
> I know this has something to do with monads, but I don't really
> understand monads yet. Is there someone who might explain this in newbie
> terms? I don't need to understand the whole thing, I don't need a rand()
> function right this minute. I just want to understand how Haskell
> separates purely functional code from non-functional code (I understand
> that a rand() function is inevitably not functional code, right?)
Well, it's *all* functional fundamentally but when people
say "non-functional" in relation to Haskell code what they
mean is in a monad. Monads, I believe, can be just thought
of as containers for state.
So like I said in an e-mail on the tutorial thread the only
distinction you need to make is between "=" which is truly a
statement of definition and not subject to change, and "<-"
which says that the left hand side is the result of the
action of the right hand side. In terms of types, "<-"
strips away the monadic type.
Note for example that if you want your main program to take
in a string and then print it to the screen, it is *NOT*
main = putStrLn . getLine (which was I first thought)
or
main = putStrLn (getLine) (which you might guess from the
type sig)
but rather
main = do
x <- getLine
putStrLn x
Because you want putStrLn to act on the string that
*resulted* from getLine, and not on getLine itself.
I'd check out this link from HaWiki on monads,
http://haskell.org/hawiki/MonadsAsContainers
More information about the Haskell-Cafe
mailing list