Personal tools

Pattern guard

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(Changed introduction to mention Haskell 2010; corrected links, added link to the Haskell Prime wiki page of Pattern Guards)
(See also)
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
Haskell 2010 changes the syntax for [[guard]]s by replacing the use of a single condition with a list of qualifiers. These qualifiers, which include both conditions and ''pattern guards'' of the form ''pat <- exp'', serve to bind/match patterns against expressions. The syntax is comparable that of a [[list comprehension]], where instead the types of ''pat'' and ''exp'' match. This makes it easy, for instance, to pattern match against (possibly failing) table lookups while deciding which definition of a function to use.
 
Haskell 2010 changes the syntax for [[guard]]s by replacing the use of a single condition with a list of qualifiers. These qualifiers, which include both conditions and ''pattern guards'' of the form ''pat <- exp'', serve to bind/match patterns against expressions. The syntax is comparable that of a [[list comprehension]], where instead the types of ''pat'' and ''exp'' match. This makes it easy, for instance, to pattern match against (possibly failing) table lookups while deciding which definition of a function to use.
  
Stealing a function from the note,
+
From the GHC user's guide,
 
<haskell>
 
<haskell>
 +
lookup :: FiniteMap -> Int -> Maybe Int
 +
 
addLookup env var1 var2
 
addLookup env var1 var2
 
   | Just val1 <- lookup env var1
 
   | Just val1 <- lookup env var1
Line 13: Line 15:
 
==See also==
 
==See also==
 
*[http://research.microsoft.com/en-us/um/people/simonpj/Haskell/guards.html Simon Peyton Jones' note] on pattern guards  
 
*[http://research.microsoft.com/en-us/um/people/simonpj/Haskell/guards.html Simon Peyton Jones' note] on pattern guards  
*[http://research.microsoft.com/en-us/um/people/simonpj/Papers/pat.htm Pattern Guards and Transformational Patterns].
+
*[https://www.microsoft.com/en-us/research/publication/pattern-guards-and-transformational-patterns/ Pattern Guards and Transformational Patterns].
*[http://www.haskell.org/ghc/docs/latest/html/users_guide/syntax-extns.html#pattern-guards GHC Manual on pattern guards]
+
*[https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#pattern-guards GHC Manual on pattern guards]
 
* [http://hackage.haskell.org/trac/haskell-prime/wiki/PatternGuards#BriefExplanation The Haskell Prime wiki page of Pattern Guards]
 
* [http://hackage.haskell.org/trac/haskell-prime/wiki/PatternGuards#BriefExplanation The Haskell Prime wiki page of Pattern Guards]
  

Latest revision as of 14:53, 7 September 2016

Haskell 2010 changes the syntax for guards by replacing the use of a single condition with a list of qualifiers. These qualifiers, which include both conditions and pattern guards of the form pat <- exp, serve to bind/match patterns against expressions. The syntax is comparable that of a list comprehension, where instead the types of pat and exp match. This makes it easy, for instance, to pattern match against (possibly failing) table lookups while deciding which definition of a function to use.

From the GHC user's guide,

lookup :: FiniteMap -> Int -> Maybe Int
 
addLookup env var1 var2
   | Just val1 <- lookup env var1
   , Just val2 <- lookup env var2
   = val1 + val2
{-...other equations...-}
will check to see if both lookups succeed, and bind the results to
val1
and
val2
before proceeding to use the equation.

[edit] See also