<div dir="ltr"><div>Hi Devs,</div><div><br></div><div>In <a href="https://gitlab.haskell.org/ghc/ghc/-/issues/20642">https://gitlab.haskell.org/ghc/ghc/-/issues/20642</a> we saw that GHC >= 8.10 outputs pattern match warnings a little differently than it used to. Example from there:</div><div><br></div><div><pre class="gmail-code gmail-highlight" lang="haskell"><span id="gmail-LC1" class="gmail-line" lang="haskell"><span class="gmail-cp">{-# OPTIONS_GHC -Wincomplete-uni-patterns #-}</span></span>
<span id="gmail-LC2" class="gmail-line" lang="haskell"></span>
<span id="gmail-LC3" class="gmail-line" lang="haskell"><span class="gmail-n">foo</span> <span class="gmail-o">::</span> <span class="gmail-p">[</span><span class="gmail-n">a</span><span class="gmail-p">]</span> <span class="gmail-o">-></span> <span class="gmail-p">[</span><span class="gmail-n">a</span><span class="gmail-p">]</span></span>
<span id="gmail-LC4" class="gmail-line" lang="haskell"><span class="gmail-n">foo</span> <span class="gmail-kt">[]</span> <span class="gmail-o">=</span> <span class="gmail-kt">[]</span></span>
<span id="gmail-LC5" class="gmail-line" lang="haskell"><span class="gmail-n">foo</span> <span class="gmail-n">xs</span> <span class="gmail-o">=</span> <span class="gmail-n">ys</span></span>
<span id="gmail-LC6" class="gmail-line" lang="haskell">  <span class="gmail-kr">where</span></span>
<span id="gmail-LC7" class="gmail-line" lang="haskell">  <span class="gmail-p">(</span><span class="gmail-kr">_</span><span class="gmail-p">,</span> <span class="gmail-n">ys</span><span class="gmail-o">@</span><span class="gmail-p">(</span><span class="gmail-kr">_</span><span class="gmail-o">:</span><span class="gmail-kr">_</span><span class="gmail-p">))</span> <span class="gmail-o">=</span> <span class="gmail-n">splitAt</span> <span class="gmail-mi">0</span> <span class="gmail-n">xs</span></span>
<span id="gmail-LC8" class="gmail-line" lang="haskell"></span>
<span id="gmail-LC9" class="gmail-line" lang="haskell"><span class="gmail-n">main</span> <span class="gmail-o">::</span> <span class="gmail-kt">IO</span> <span class="gmail-nb">()</span></span>
<span id="gmail-LC10" class="gmail-line" lang="haskell"><span class="gmail-n">main</span> <span class="gmail-o">=</span> <span class="gmail-n">putStrLn</span> <span class="gmail-o">$</span> <span class="gmail-n">foo</span> <span class="gmail-o">$</span> <span class="gmail-s">"Hello, coverage checker!"</span></span><span style="font-family:arial,sans-serif"><br></span></pre><pre class="gmail-code gmail-highlight" lang="haskell"><span style="font-family:arial,sans-serif">Instead of saying</span><br><br><span id="gmail-LC1" class="gmail-line" lang="plaintext">ListPair.hs:7:3: warning: [-Wincomplete-uni-patterns]</span>
<span id="gmail-LC2" class="gmail-line" lang="plaintext">    Pattern match(es) are non-exhaustive</span>
<span id="gmail-LC3" class="gmail-line" lang="plaintext">    In a pattern binding: Patterns not matched: (_, [])</span>
<br></pre><pre class="gmail-code gmail-highlight" lang="haskell"><span style="font-family:arial,sans-serif">We now say</span><br><br><span id="gmail-LC50" class="gmail-line" lang="plaintext">ListPair.hs:7:3: warning: [-Wincomplete-uni-patterns]</span>
<span id="gmail-LC51" class="gmail-line" lang="plaintext">    Pattern match(es) are non-exhaustive</span>
<span id="gmail-LC52" class="gmail-line" lang="plaintext">    In a pattern binding:</span>
<span id="gmail-LC53" class="gmail-line" lang="plaintext">        Patterns of type ‘([a], [a])’ not matched:</span>
<span id="gmail-LC54" class="gmail-line" lang="plaintext">            ([], [])</span>
<span id="gmail-LC55" class="gmail-line" lang="plaintext">            ((_:_), [])</span>
<br></pre>E.g., newer versions do (one) case split on pattern variables that haven't even been scrutinised by the pattern match. That amounts to quantitatively more pattern suggestions and for each variable a list of constructors that could be matched on.<br>The motivation for the change is outlined in <a href="https://gitlab.haskell.org/ghc/ghc/-/issues/20642#note_390110">https://gitlab.haskell.org/ghc/ghc/-/issues/20642#note_390110</a>, but I could easily be swayed not to do the case split. Which arguably is less surprising, as Andreas Abel points out.<br><br>Considering the other examples from my post, which would you prefer?<br><br>Cheers,<br>Sebastian</div></div>