Malcolm Wallace wrote:
Simon Peyton-Jones <[EMAIL PROTECTED]> wrote:

I have finally written up a proposal for adding
"view patterns" to Haskell.
        http://hackage.haskell.org/trac/haskell-prime/wiki/ViewPatterns

I have taken the liberty of correcting a couple of mistakes in your
example code (on the wiki).

To add to the bikeshed discussion of syntax, did you consider and reject
the obvious use of '<-' rather than '->', which would more closely match
the pattern guard syntax?  For example,

      f ((name,rest) <- regexp "[a-z]*") = ...

Yes, I'd prefer that too. However, note that while the right arrow syntax looks confusing when used on the left of a case alternative:

   case e of
      (regexp "[a-z]*" -> (name,rest)) -> ...

the left arrow syntax looks strange when used in a statement:

   do
      ((name,rest) <- regexp "[a-z]*") <- readFile "foo"
      ...

although on balance, "pattern on the left of <-" is a better rule than "pattern on the left of -> when it is preceded by \, but on the right otherwise" :-) Being able to distinguish binding from bound occurrences of variables quickly is very important for reading code, I'm worried that there won't be a good syntax for view patterns that gets this right.

Personally I remain to be convinced by view patterns. All these examples can be rewritten using either auxiliary functions, pattern guards, monads, or a combination of these. Too much choice is counter-productive.

      parsePacket ((n, (val,bs) <- bits n) <- bits 3) = ...
vs
      parsePacket (bits 3 -> (n, (bits n -> val bs))) = ...

are these significantly better than

  parsePacket p = parseBits p $ do n <- bits 3; val <- bits n; ...

given a simple bit-parsing monad?

(I just noticed that Duncan posted something similar while I was writing this, oh well).

Cheers,
        Simon
_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to