[Haskell-cafe] About do notation.

Thomas M. DuBuisson thomas.dubuisson at gmail.com
Wed Oct 15 03:26:51 EDT 2008


Magicloud wrote:
> Hi,
>     As some articles say, do notation is expand to (>>) and (>>=)
> when 
> being compiled.
>     So I want to know the details. Like:
> main = do
>   a <- getArgs
>   b <- getLine
>   myFunc1 (head a) b
>   myFunc2 b (head a)
> 
>     I cannot figure out what is the (>>) and (>>=) way of this.
> 
> Thanks.

In the beginning, their was the bind (>>=) operator and lambdas.  You
bind the results of one action to the argument of the next
	(act >>= \a -> act2 a)

A genious realized that not all actions have an intersting result, so
instead of a meaningless binding (act >>= \_ -> act2) you can sequence
the actions (act >> act2).

So code would look like:
------------------
main =
  getArgs >>= \a -> getLine >>= \b ->
  myFunc1 (head a) b >>
  myFunc2 b (head a)
------------------

It didn't take too long and people got in the habbit of lining up the
binding on the right-most column:

------------------
main =
  getArgs 		>>= \a ->
  getLine 		>>= \b ->
  myFunc1 (head a) b 	>>
  myFunc2 b (head a)
------------------

And eventually someone figured out this looked an aweful lot like
imparitive code with the variable and function flipped around (and some
ugly characters inbetween).
    getArgs >>= \a ->
	~
    a = getArgs();

So the shortest most non-descript word, 'do', was found to ensure no one
would have to type much.

Tom

* Story not historically accurate.  Technical accuracy is questionable.
Sanity of author not guarenteed.  All rights reserved.  No refunds.



More information about the Haskell-Cafe mailing list