Introducing pattern matching
We cheated a little when moving from the second version of
The difference is what happens when the argument is smaller than
1. In both the second and the third versions, they will be matched only on the final cases (by the catch-all patterns
x, respectively). In the second version, the final case evaluates to
0 at once. In the third version, however, there is also the
x <= 6 guard, which is evidently true when the argument is less than
1; and thus the result will be
7 - x. Thus,
pts (-4) for instance evaluates to
0 with the second version but to
11 with the third version.
N.B.: In a footnote to the text we claimed that for this example we wouldn't be too worried about what should happen if
pts was given nonsensical inputs; still, corner cases like this are the sort of issue that tends to trip us up when writing "real" code. In other words: it might make a difference in your program, so stay alert.
Here is a variation of the third version which is exactly equivalent to the second one:
pts :: Int -> Int pts 1 = 10 pts 2 = 6 pts x | x < 1 || x > 7 = 0 | otherwise = 7 - x