<div dir="ltr"><div><span style="font-family:monospace,monospace">OK, I've been doing some localized, "surgical" modifications to test my code, to see if I can pinpoint what part is causing the compile error "Some constructor unification variables are undetermined in declaration", mentioned in my previous post:</span><br></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><a href="http://www.impredicative.com/pipermail/ur/2015-July/002109.html">http://www.impredicative.com/pipermail/ur/2015-July/002109.html</a></font></div><div><font face="monospace, monospace"><a href="https://github.com/StefanScott/urweb-colorThing_Fk">https://github.com/StefanScott/urweb-colorThing_Fk</a><br></font></div><div><font face="monospace, monospace"><a href="https://github.com/StefanScott/urweb-colorThing_Fk/issues/1">https://github.com/StefanScott/urweb-colorThing_Fk/issues/1</a><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">This compile error doesn't mention a specific line - it gives a big range of lines, covering all the function definitions in the program.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">The error message seems to be mentioning table 'color' (and it seems to think the 'Id' column of 'color' is of type 'string' - but that column was actually defined to be of type 'int').</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">So let's play with that part of the code. Here's the original:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  thingRows <- </font></div><div><font face="monospace, monospace">    queryX1 (SELECT * FROM thing)</font></div><div><font face="monospace, monospace">    (fn r => <xml> <tr> </font></div><div><font face="monospace, monospace">               <td> {[r.Id]} </td> </font></div><div><font face="monospace, monospace">               <td> {[r.Nam]} </td> </font></div><div><font face="monospace, monospace">               <td> {[r.Color]} </td> </font></div><div><font face="monospace, monospace">             </tr> </xml>);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  colorOptions <- </font></div><div><font face="monospace, monospace">    queryX1 (SELECT * FROM color)</font></div><div><font face="monospace, monospace">    (fn r => <xml> <option value={r.Id}> {[r.Nam]} </option> </xml>);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Let's try removing the second statement, which appears to be the problematic one.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Results:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(1) If we *remove* the 2nd statement, which was setting 'colorOptions' (and if we also modify the remainder of the code, so that it no longer references 'colorOptions'), then this section now looks like this: </font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  thingRows <- </font></div><div><font face="monospace, monospace">    queryX1 (SELECT * FROM thing)</font></div><div><font face="monospace, monospace">    (fn r => <xml> <tr> </font></div><div><font face="monospace, monospace">               <td> {[r.Id]} </td> </font></div><div><font face="monospace, monospace">               <td> {[r.Nam]} </td> </font></div><div><font face="monospace, monospace">               <td> {[r.Color]} </td> </font></div><div><font face="monospace, monospace">             </tr> </xml>);</font></div><div><font face="monospace, monospace"><br></font></div><div><span style="font-family:monospace,monospace">And now it COMPILES.</span></div><div><span style="font-family:monospace,monospace"><br></span></div><div><font face="monospace, monospace">So this would seem to indicate that there was something wrong with the statement which set 'colorOptions'. </font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">But wait! Let's do one more test:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(2) If we *replace* the 2nd statement with a copy of the 1st statement (and in the 2nd copy we change 'thingRows' to 'thingRows2' - and we also again remove references to 'colorOptions' elsewhere in my code), then the code looks like this:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  thingRows <- </font></div><div><font face="monospace, monospace">    queryX1 (SELECT * FROM thing)</font></div><div><font face="monospace, monospace">    (fn r => <xml> <tr> </font></div><div><font face="monospace, monospace">               <td> {[r.TId]} </td> </font></div><div><font face="monospace, monospace">               <td> {[r.TNam]} </td> </font></div><div><font face="monospace, monospace">               <td> {[r.Color]} </td> </font></div><div><font face="monospace, monospace">             </tr> </xml>);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  thingRows2 <- </font></div><div><font face="monospace, monospace">    queryX1 (SELECT * FROM thing)</font></div><div><font face="monospace, monospace">    (fn r => <xml> <tr> </font></div><div><font face="monospace, monospace">               <td> {[r.TId]} </td> </font></div><div><font face="monospace, monospace">               <td> {[r.TNam]} </td> </font></div><div><font face="monospace, monospace">               <td> {[r.Color]} </td> </font></div><div><font face="monospace, monospace">             </tr> </xml>);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">AND NOW WE GET THE SAME COMPILE ERROR AS PREVIOUSLY (before we did any modifications):</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  "Some constructor unification variables are undetermined in declaration".</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Question:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Cases (1) and (2) are identical. The only difference is that case (2) runs the same statement twice, and assigns the second result to a new identifier.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Why would case (1) compile, while case (2) does not?</font></div></div>