wiki:PatternGuards

Version 5 (modified by simonmar@…, 4 years ago) (diff)

--

Pattern Guards

Ticket: #56

See ExtensionDescriptionHowto for information on how to write these extension descriptions. Please add any new extensions to the list of HaskellExtensions.

Brief Explanation

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.

References

Pros

  • 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.

Cons

  • 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.