Pattern matching is not just sugar for an if-elseif chain, since compilers will check for exhaustiveness. This is especially important when used with sum types (which are the primary motivator for this feature):<p><pre><code>    data Thing
      = Foo String
      | Bar Int Double
      | Baz String String

    case thing of
      Foo s -&gt; putStrLn s
      Bar i f -&gt; -- ...
      Baz s1 s2 -&gt; -- ...
</code></pre>
If you later add another variant to Thing, the compiler will check that all pattern matches against it account for the new case. (Wildcard matches alleviate the need always to handle every case.) An if-elseif chain, however, would still compile after adding the new variant, so you must track down the usages manually.