Pattern Matching on Literals

Learn about pattern matching on literal values.

Pattern matching on literals

Instead of using pattern variables, we can also write function equations using literal values as patterns. Here is an example:

isZero :: Int -> Bool
isZero 0 = True
isZero n = False

This function has two defining equations. The first one uses the numeric literal 0 as the pattern. We can read it as "if the argument to isZero is 0, the result is True". The second equation uses a pattern variable n, and says that the result to isZero should be False, for any value of n.

If a function has several defining equations, they will be applied from top to bottom for evaluating expressions involving the function’s application. However, an equation is only used if the argument to the function matches the pattern in the function equation. If several equations match, the first equation that matches is chosen.

The rules for matching are simple:

  • Literal patterns match only the exact value they represent. That means 0 in the first equation of isZero matches only the Int value 0.
  • Pattern variables match any value of the type they stand in for. So the variable n is the second equation if isZero matches any Int value.

For example, to evaluate the expression isZero 0, Haskell checks whether the first equation isZero 0 = True can be applied. This is the case because the argument 0 matches the literal pattern of the equation. So the result of isZero 0 is True. The second equation is ignored (although the pattern would match).

On the other hand, when evaluating isZero 5, the first equation can not be applied, as the argument 5 does not match the pattern 0. Thus, the second equation is tried, i.e. isZero n = False. As 5 matches the pattern variable n, this equation is used and the result is False.

If we load and run this function in ghci, we in fact see that it works as intended.

*IsZero> isZero 0
True
*IsZero> isZero 5
False

Here is a terminal running ghci where you can try out the isZero function:

Get hands-on with 1400+ tech skills courses.