<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">
I fixed it!<br>
<br>
As I expected, it was a combination of two really silly, really easy to fix, errors.</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">
<ol>
<li><span>In the line of the error, I was trying to give it a type annotation to make it easier for the type checker, but I forgot to replace the type variable "uv" with the actual type I want it to be using: "UnifVariable".</span></li><li><span>When I fixed this, I got the actual error that was producing this: It was not finding the instance I was expecting it to find. The reason is that I have two types "UnifSystem" and "FullUnifSystem", the latter of which is a wrapper with some extra
 info for the previous one. The instance is for UnifSystem, but I was feeding it FullUnifSystem to the function, so of course it was not finding the instance (and instead going into some infinite reduction trying to find an instance by replacing the variable
 "uv" with some magic type that didn't exist).</span></li></ol>
<div><br>
</div>
<div>Change FullUnifSystem to UnifSystem (which is what I wanted since the beginning anyway) and now it works.<br>
<br>
As a reflection, I know these are some of the dangers of using UndecidableInstances, but I found some interesting suggestions for the GHC compiler when trying to debug this, that I wish were already implemented:
<br>
<br>
<a href="https://gitlab.haskell.org/ghc/ghc/-/issues/15613" id="LPlnk">https://gitlab.haskell.org/ghc/ghc/-/issues/15613</a><br>
<div class="_Entity _EType_OWALinkPreview _EId_OWALinkPreview _EReadonly_1">
<div id="LPBorder_GTaHR0cHM6Ly9naXRsYWIuaGFza2VsbC5vcmcvZ2hjL2doYy8tL2lzc3Vlcy8xNTYxMw.." class="LPBorder526414" style="width: 100%; margin-top: 16px; margin-bottom: 16px; position: relative; max-width: 800px; min-width: 424px;">
<table id="LPContainer526414" role="presentation" style="padding: 12px 36px 12px 12px; width: 100%; border-width: 1px; border-style: solid; border-color: rgb(200, 200, 200); border-radius: 2px;">
<tbody>
<tr style="border-spacing: 0px;" valign="top">
<td style="width: 100%;">
<div id="LPTitle526414" style="font-size: 21px; font-weight: 300; margin-right: 8px; font-family: "wf_segoe-ui_light", "Segoe UI Light", "Segoe WP Light", "Segoe UI", "Segoe WP", Tahoma, Arial, sans-serif; margin-bottom: 12px;">
<a target="_blank" id="LPUrlAnchor526414" href="https://gitlab.haskell.org/ghc/ghc/-/issues/15613" style="text-decoration: none; color:var(--themePrimary);">#15613: GHCi command, tracing steps of instance resolution for Constraint or expression · Issues · Glasgow
 Haskell Compiler / GHC · GitLab</a></div>
<div id="LPDescription526414" style="font-size: 14px; max-height: 100px; color: rgb(102, 102, 102); font-family: "wf_segoe-ui_normal", "Segoe UI", "Segoe WP", Tahoma, Arial, sans-serif; margin-bottom: 12px; margin-right: 8px; overflow: hidden;">
Another GHCi command (#15610 (closed)), :elab <constraint> traces instance resolution for <constraint>.This is already something people do by hand (ticket:10318# ...</div>
<div id="LPMetadata526414" style="font-size: 14px; font-weight: 400; color: rgb(166, 166, 166); font-family: "wf_segoe-ui_normal", "Segoe UI", "Segoe WP", Tahoma, Arial, sans-serif;">
gitlab.haskell.org</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<br>
<br>
And I found this blog post quite exactly a description of my experience with type classes:<br>
<br>
<a href="https://mgsloan.com/posts/inspecting-haskell-instance-resolution/" id="LPlnk">https://mgsloan.com/posts/inspecting-haskell-instance-resolution/</a><br>
<div class="_Entity _EType_OWALinkPreview _EId_OWALinkPreview_1 _EReadonly_1">
<div id="LPBorder_GTaHR0cHM6Ly9tZ3Nsb2FuLmNvbS9wb3N0cy9pbnNwZWN0aW5nLWhhc2tlbGwtaW5zdGFuY2UtcmVzb2x1dGlvbi8." class="LPBorder122477" style="width: 100%; margin-top: 16px; margin-bottom: 16px; position: relative; max-width: 800px; min-width: 424px;">
<table id="LPContainer122477" role="presentation" style="padding: 12px 36px 12px 12px; width: 100%; border-width: 1px; border-style: solid; border-color: rgb(200, 200, 200); border-radius: 2px;">
<tbody>
<tr style="border-spacing: 0px;" valign="top">
<td>
<div id="LPImageContainer122477" style="position: relative; margin-right: 12px; height: 179.97px; overflow: hidden; width: 240px;">
<a target="_blank" id="LPImageAnchor122477" href="https://mgsloan.com/posts/inspecting-haskell-instance-resolution/"><img id="LPThumbnailImageId122477" alt="" style="display: block;" width="240" height="179" src="https://mgsloan.com/images/haskell-placeholder-banner.jpg"></a></div>
</td>
<td style="width: 100%;">
<div id="LPTitle122477" style="font-size: 21px; font-weight: 300; margin-right: 8px; font-family: "wf_segoe-ui_light", "Segoe UI Light", "Segoe WP Light", "Segoe UI", "Segoe WP", Tahoma, Arial, sans-serif; margin-bottom: 12px;">
<a target="_blank" id="LPUrlAnchor122477" href="https://mgsloan.com/posts/inspecting-haskell-instance-resolution/" style="text-decoration: none; color:var(--themePrimary);">Inspecting Haskell Instance Resolution</a></div>
<div id="LPDescription122477" style="font-size: 14px; max-height: 100px; color: rgb(102, 102, 102); font-family: "wf_segoe-ui_normal", "Segoe UI", "Segoe WP", Tahoma, Arial, sans-serif; margin-bottom: 12px; margin-right: 8px; overflow: hidden;">
An old prototype: explain-instance. I've wanted a solution to this for a long time. 5 years ago, I wrote a prototype, in the form of a Template Haskell library which takes a rather wild approach.It would be much better to implement it directly in GHC, but at
 the time I was much more familiar with Template Haskell, and the perverse cleverness of the approach has some appeal.</div>
<div id="LPMetadata122477" style="font-size: 14px; font-weight: 400; color: rgb(166, 166, 166); font-family: "wf_segoe-ui_normal", "Segoe UI", "Segoe WP", Tahoma, Arial, sans-serif;">
mgsloan.com</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<br>
I even downloaded Michael Sloan's ExplainInstances extension to try to help me figure this out, but I couldn't get it to work due to some module version issues.<br>
<br>
If Michael reads this, I fully support your interest in sorting out this problem. This is not the first time I lose a lot of time trying to debug silly errors like this because I need to reverse engineer what the type checker is trying to do.<br>
<br>
Thanks to Viktor for the reply again, and to anyone who may have dedicated more than 10 seconds thinking about this.<br>
<br>
Juan Casanova.<br>
</div>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Haskell-Cafe <haskell-cafe-bounces@haskell.org> on behalf of CASANOVA Juan <Juan.Casanova@ed.ac.uk><br>
<b>Sent:</b> 24 January 2021 17:56<br>
<b>To:</b> haskell-cafe@haskell.org <haskell-cafe@haskell.org><br>
<b>Subject:</b> Re: [Haskell-cafe] Puzzling "Reduction stack overflow" error message</font>
<div> </div>
</div>
<style type="text/css" style="display:none">
<!--
p
        {margin-top:0;
        margin-bottom:0}
-->
</style>
<div dir="ltr">
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
<font size="2"><span style="font-size:11pt">"Have you tried "-freduction-depth=0"?  Does that "terminate"?"<br>
<br>
I had not before you said it. While there is a long tower of constraints, there are no recursive ones that I know of that might drastically increase the depth so I was inclined, by the heuristic that normally just going deeper doesn't solve this kind of problems,
 not to do it.<br>
<br>
But I have now, since when you said it I realized it was definitely something to try.<br>
<br>
I have tried with -freduction-depth=20000, and it still fails (with the same Eq OFunction constraint).<br>
With -freduction-depth=1000000 or -freduction-depth=0, it does not terminate within a minute or two.<br>
<br>
So it does look like there is some infinite depth going on.<br>
<br>
Thank you for your suggestion anyway. Any more ideas? Mostly I am looking for potential explanations for why it would have an issue with infinite reduction with a constraint that's trivially satisfiable, and then I can try to rationalize that and see how it
 could apply to my case.<br>
</span></font></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
<font size="2"><span style="font-size:11pt"><br>
</span></font></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0); background-color:rgb(255,255,255)">
<font size="2"><span style="font-size:11pt">Juan Casanova.</span></font><br>
</div>
<div id="x_appendonsend"></div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="x_divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Haskell-Cafe <haskell-cafe-bounces@haskell.org> on behalf of Viktor Dukhovni <ietf-dane@dukhovni.org><br>
<b>Sent:</b> 24 January 2021 05:06<br>
<b>To:</b> haskell-cafe@haskell.org <haskell-cafe@haskell.org><br>
<b>Subject:</b> Re: [Haskell-cafe] Puzzling "Reduction stack overflow" error message</font>
<div> </div>
</div>
<div class="x_BodyFragment"><font size="2"><span style="font-size:11pt">
<div class="x_PlainText">This email was sent to you by someone outside the University.<br>
You should only click on links or attachments if you are certain that the email is genuine and the content is safe.<br>
<br>
On Sun, Jan 24, 2021 at 03:15:24AM +0000, CASANOVA Juan wrote:<br>
<br>
> The following function I have is the one that throws the error:<br>
><br>
> resolve_to_constraints_metacnf :: SOMetaSignature -> SOMetaCNF -> Computation (Maybe SOMetaUnifSystem)<br>
> resolve_to_constraints_metacnf sig cnf = result<br>
> where<br>
> f1 = (ADDirect <$>) :: SOMetaliteral -> SOMetaUnifLiteral;<br>
> f2 = (f1 <$>) :: [SOMetaliteral] -> [SOMetaUnifLiteral];<br>
> f3 = (f2 <$>) :: [[SOMetaliteral]] -> [[SOMetaUnifLiteral]];<br>
> ucnf = f3 cnf :: [[SOMetaUnifLiteral]];<br>
> resolved = res_computeresolve SOResGreedyFactorH ucnf :: StateT uv Computation (Maybe SOMetaUnifSystem);<br>
> runstated = runStateT resolved (UnifVar 0);<br>
> result = fst <$> runstated<br>
><br>
> The error starts as follows:<br>
><br>
> Reduction stack overflow; size = 201<br>
>       When simplifying the following type: Eq OFunction<br>
<br>
This error is reported by:<br>
<br>
    solverDepthErrorTcS :: CtLoc -> TcType -> TcM a<br>
    solverDepthErrorTcS loc ty<br>
      = setCtLocM loc $<br>
        do { ty <- zonkTcType ty<br>
           ; env0 <- tcInitTidyEnv<br>
           ; let tidy_env     = tidyFreeTyCoVars env0 (tyCoVarsOfTypeList ty)<br>
                 tidy_ty      = tidyType tidy_env ty<br>
                 msg<br>
                   = vcat [ text "Reduction stack overflow; size =" <+> ppr depth<br>
                          , hang (text "When simplifying the following type:")<br>
                               2 (ppr tidy_ty)<br>
                          , note ]<br>
           ; failWithTcM (tidy_env, msg) }<br>
      where<br>
        depth = ctLocDepth loc<br>
        note = vcat<br>
          [ text "Use -freduction-depth=0 to disable this check"<br>
          , text "(any upper bound you could choose might fail unpredictably with"<br>
          , text " minor updates to GHC, so disabling the check is recommended if"<br>
          , text " you're sure that type checking should terminate)" ]<br>
<br>
Have you tried "-freduction-depth=0"?  Does that "terminate"?<br>
<br>
--<br>
    Viktor.<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.<br>
</div>
</span></font></div>
The University of Edinburgh is a charitable body, registered in Scotland, with registration number SC005336.
</div>
</body>
</html>