<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi,<div class=""><br class=""></div><div class="">I'm trying to use the -fdefer-type-error flag, discussed in  an ICFP paper from 2012:</div><div class=""><a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.366.841&rep=rep1&type=pdf" class="">http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.366.841&rep=rep1&type=pdf</a> </div><div class=""><br class=""></div><div class="">On page 2, the paper has an example, showing that fdefer-type-errors will allow a the first element to be extracted fro a tuple, even if the second element does not correctly typecheck:</div><div class=""><br class=""></div><div class="">
                
        
        
                <div class="page" title="Page 2">
                        <div class="layoutArea">
                                <div class="column">
                                        <pre class=""><span style="font-size: 9.000000pt; font-family: 'CMTT9'" class=""> ghci> let foo = (True, ’a’ && False)
 Warning: Couldn’t match ‘Bool’ with ‘Char’
 ghci> :type foo
 (Bool, Bool)
 ghci> fst foo
 True</span></pre><pre class=""><span style="font-size: 9pt;" class=""><font face="Helvetica" class="">However, with GHC 8.2.2, I get an error when trying to do this:</font></span></pre><pre class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">GHCi, version 8.2.2: <a href="http://www.haskell.org/ghc/" class="">http://www.haskell.org/ghc/</a>  :? for help</span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">Prelude> let foo = (True, 'a' && False)</span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""></span><br class=""></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(200, 20, 201);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><b class=""><interactive>:1:18: </b></span><span style="font-variant-ligatures: no-common-ligatures" class=""><b class="">warning:</b></span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><b class=""> [</b></span><span style="font-variant-ligatures: no-common-ligatures" class=""><b class="">-Wdeferred-type-errors</b></span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""><b class="">]</b></span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><b class="">    • Couldn't match expected type ‘Bool’ with actual type ‘Char’</b></span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><b class="">    • In the first argument of ‘(&&)’, namely ‘'a'’</b></span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><b class="">      In the expression: 'a' && False</b></span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><b class="">      In the expression: (True, 'a' && False)</b></span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">Prelude> :type foo</span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">foo :: (Bool, Bool)</span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">Prelude> fst foo</span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">*** Exception: <interactive>:1:18: error:</span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    • Couldn't match expected type ‘Bool’ with actual type ‘Char’</span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">    • In the first argument of ‘(&&)’, namely ‘'a'’</span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      In the expression: 'a' && False</span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">      In the expression: (True, 'a' && False)</span></div><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">(deferred type error)</span></div>
</pre><pre class=""><font face="Helvetica" class="">Does anyone know the reason for the change in the behavior?  Is there any way to get back to the old behavior, i.e. allow the first element of the tuple to still be extracted?  Ideally, I would like to get the errors given by defer-type-errors to be as fine-grained/close-to-the-source as possible.</font></pre><pre class=""><font face="Helvetica" class=""><br class=""></font></pre><pre class=""><font face="Helvetica" class="">Thanks,</font></pre><pre class=""><font face="Helvetica" class="">Bill Hallahan</font></pre>
                                </div>
                        </div>
                </div></div></body></html>