The `do' syntax for monads in Haskell carries out binding in an
assignment style:

  pat <- exp;

as in `x <- getChar'  or `cs <- readLine'.  Sometimes though a
declaration style would seem more appropriate:

  getChar x; putChar (upperCase x);

  getInt x; getInt y; return (x+y)

  newMVar data_var; newMVar ack_var; putMVar ack_var (); 
  return (data_var,ack_var)

where this last example uses the MVar's of Concurrent Haskell.
This is particularly suitable with expressions designed to
produce a supply of fresh items: names, channels, handles,
MVar's, whatever.  The declaration `channel c' is much more
natural than `c <- freshChannel'; after all, this is why we
already have `type', `data', `class', `instance', and so forth.

Is there then a consistent way to add this to the language?
Surely, yes.  It need only be a change at the syntax level:
statements within a `do' for monad constructor `M' that are of
the form

  exp pat

where `exp' is of type `M a' should be translated to

  pat <- exp

which is then transformed as usual to 

 exp >>= \pat -> ...  

Questions of irrefutable patterns and match failure would be
handled exactly as now.

I'm not suggesting that this is always a suitable form for
binding.  Like `this` for infix operations, it makes sense for some
functions and not others; and even then, it can be reasonable to
give a different name to a function according to how you expect
it to be used.

Nor is this a fully-fledged call-by-reference facility; just
some syntactic sugar to ease writing monad expressions, as with
the `do' syntax itself.

So: is this scheme possible, and is it useful?

Possibility means: does it give any ambiguities, and how does it
fit with existing parsers and typecheckers?  Note that in the
form `exp pat' the expression `exp' has type `M a' for some
constructor `M', so there is no immediate clash with function
application.  On the other hand, it could still be a real effort 
to parse.

Utility means: what good does it do, and what harm?  I think that
for certain operations, particularly in the IO monad, a
declaration form does add clarity.  Others may disagree, and say
that Haskell is terse enough as it is.

Comments, anyone?  ( Implementation, anyone? )
        
Ian Stark.

....................................................................
Ian Stark                                 http://www.brics.dk/~stark
BRICS, Department of Computer Science, University of Aarhus, Denmark



Reply via email to