The syntax for guards is changed to
gd -> | qual1, ..., qualn
(Haskell 98 allows only a single, Boolean, guard.) In pattern guards of the form p <- e, the two sides must have the same type, and if the value if e does not match p, the guards fails.
- Case Expressions and Formal Semantics of Pattern Matching in the Haskell 98 Report
- Simon's original proposal, 1997.
- Pattern guards in the GHC User's Guide
- Pattern Guards and Transformational Patterns, Martin Erwig and Simon Peyton Jones, Haskell Workshop, 2000.
- avoids awkward case constructs in certain situations
- a relatively small and orthogonal extension
- the required changes to the Report are clearly laid out in the above paper.
- the re-use of monadic binding notation from list comprehensions and do-notation for pure matching is confusing, but the more rational = would create parsing difficulties, e.g.
f p | x = y = z
Results of committee discussion for Haskell 2010
- in the first bullet in 3.13, there's a double period, and I don't think the contextual difference can be called "minor".
- it would help to present the three types of guard in the same order each time they're discussed.
- in 3.17, the rule for clause (w) has parentheses around p <- e0, which is not permitted by the syntax.