<div dir="ltr"><div><font face="monospace, monospace">[ Note: This same message may be viewed with better formatting here: <a href="https://github.com/StefanScott/UrWeb-crudWidgetTxn1">https://github.com/StefanScott/UrWeb-crudWidgetTxn1</a> ]</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Goal:<br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">I am attempting to do a minimal modification of the Crud1 demo, to change the result type of the `Widget` field in the constructor `colMeta` from `xml` to `transaction xml`:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  OLD: <a href="http://www.impredicative.com/ur/demo/crud1.html">http://www.impredicative.com/ur/demo/crud1.html</a></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  NEW: <a href="https://github.com/StefanScott/UrWeb-crudWidgetTxn1">https://github.com/StefanScott/UrWeb-crudWidgetTxn1</a></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  DIFF: <a href="https://github.com/StefanScott/UrWeb-crudWidgetTxn1/commit/77edc38ce23d44e7e00910e433feb9946a7ad1d9">https://github.com/StefanScott/UrWeb-crudWidgetTxn1/commit/77edc38ce23d44e7e00910e433feb9946a7ad1d9</a></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">- The `Widget` field in (my simplified, working version of) the Crud1 demo originally declares a function having result type of `xml`:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    `Widget : nm :: Name -> xml form [] [nm = widget]`</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">- The `Widget` field in my new (non-working) version UrWeb-crudWidgetTxn1 has been changed, so that it now declares a function having result type `transaction xml`:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    `Widget : nm :: Name -> transaction (xml form [] [nm = widget])`</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">GitHub commit allowing line-by-line comparison:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">My (minimal) changes are highlighted in a specially created GitHub repo having only 2 commits:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(1) The *first* commit is (a simplified version of) the Crud1 demo (it only does SELECT and INSERT - no DELETE or UPDATE). Being based directly on Crud1, it compiles and runs correctly.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(2) The *second* commit merely changes the result type of `Widget` from `xml` to `transaction xml` - in three places:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  <a href="https://github.com/StefanScott/UrWeb-crudWidgetTxn1/commit/77edc38ce23d44e7e00910e433feb9946a7ad1d9">https://github.com/StefanScott/UrWeb-crudWidgetTxn1/commit/77edc38ce23d44e7e00910e433feb9946a7ad1d9</a></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(a) the *declaration* of the function in field `Widget` of constructor `colMeta`</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(b) the *invocation* of the function in field `Widget`</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(c) the declared *types* of the higher-order functional arguments to `@foldR`</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Apparently something is wrong with (b) and/or (c) in UrWeb-crudWidgetTxn1.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Errors:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">My modified version of Crud1, using *meta-programming*, does not compile. </font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">I suspect this is because something is wrong with the types of the arguments in the call to `@foldR`.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">My new version gives "Unification failure" compile errors ("Have transaction, Need xml" and "Have xml, Need transaction"). The complete compile error message is here:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  <a href="https://github.com/StefanScott/UrWeb-crudWidgetTxn1/blob/master/err.001.txt">https://github.com/StefanScott/UrWeb-crudWidgetTxn1/blob/master/err.001.txt</a></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">The portions below underlined using `(* ^^^^ *)` are probably incorrect:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  <a href="https://github.com/StefanScott/UrWeb-crudWidgetTxn1/blob/master/crudWidgetTxn.ur#L82-L98">https://github.com/StefanScott/UrWeb-crudWidgetTxn1/blob/master/crudWidgetTxn.ur#L82-L98</a></font></div><div><font face="monospace, monospace"> <br></font></div><div><font face="monospace, monospace">  <form></font></div><div><font face="monospace, monospace">    { @foldR </font></div><div><font face="monospace, monospace">      [ colMeta ] </font></div><div><font face="monospace, monospace">      [ fn cols => transaction (xml form [] (map snd cols)) ]</font></div><div><font face="monospace, monospace">                (* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ *)</font></div><div><font face="monospace, monospace">      ( fn [nm :: Name] [t ::_] [rest ::_] [[nm] ~ rest] (col : colMeta t) acc => </font></div><div><font face="monospace, monospace">        col_widget_nm <- col.Widget [nm] ;</font></div><div><font face="monospace, monospace">     (* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ *)          </font></div><div><font face="monospace, monospace">        return </font></div><div><font face="monospace, monospace">        <xml></font></div><div><font face="monospace, monospace">          <li> {cdata col.Nam}: {col_widget_nm}</li></font></div><div><font face="monospace, monospace">                               (* ^^^^^^^^^^^^^ *)          </font></div><div><font face="monospace, monospace">          {useMore acc}</font></div><div><font face="monospace, monospace">        </xml> )</font></div><div><font face="monospace, monospace">      (return <xml/>)</font></div><div><font face="monospace, monospace">      M.fl </font></div><div><font face="monospace, monospace">      M.cols }</font></div><div><font face="monospace, monospace">    <submit action={create}/></font></div><div><font face="monospace, monospace">  </form></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Question (1):</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Can anyone see what might be wrong with the types in the call to `@foldR` above?</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Question (2):</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Does this overall strategy make sense - minimally modifying Crud1 to change the result type of the `Widget` function from `xml` to `transaction xml`?</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">I adopted this strategy because:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(a) If I want `Widget` to return a `<select>` tag containing `<option>` tags, this requires doing a "transaction" to read the database - so it seems that it will be necessary for `Widget` to return a "transactional" type.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(b) The working, non-meta-programming example <a href="https://github.com/StefanScott/UrWeb-colorSize">https://github.com/StefanScott/UrWeb-colorSize</a> demonstrates that it is indeed possible to insert something of type `transaction xml` inside something of type `transaction form`.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(c) Due to the complexity of the higher-order types in the Crud1 demo, I would like to perform a "surgical" or "extremely limited" extension - changing as *little* of Crud1 as possible, so as to be able to leverage most of the existing, correct code (which involves several higher-order functions that would be very difficult for me to correctly define "from scratch"!)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Thanks for any help!</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">---</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Motivation:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">I believe that changing the result type of the `Widget` function is necessary for a related project: defining data-bound `<select>` widgets for foreign-key fields.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">This requires doing a "read" transaction on the database - eg, running `queryX1` to create `<option>` tags in a `<select>` tag, corresponding to records in the "parent" table of the foreign-key field.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">For *non-foreign* fields of types `bool`, `int`, `float` and `string`, the Crud1 demo already includes examples of definitions of functions for the `Widget` field which return a `<textbox>` and a `<checkbox>`.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">For cases where the `Widget`'s column is a *foreign-key* column, I want to define a function returning a `<select>` tag containing `<option>` tags. This will of course require performing a "read" transaction on the database - in order to query the records of the "parent" table of the foreign-key column.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">I therefore believe that the `<select>` widget, composed of `<option>` tags, *must* be a transactional type, due to the need to read the database to select the records used to build the actual widget.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">So it seems that a good approach would be to modify the Crud1 demo so that the function in the `Widget` field has a result type of `transaction xml` instead of `xml`.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Comparison with a working, *non-meta-programming* example:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">As a test, I have also developed a working example *without* using meta-programming. </font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">It lets the user edit a table (Thing) having 2 foreign-key columns (Color and Size). </font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">There is a live demo online, plus a GitHub repo:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  <a href="http://personalenglish.org/ColorSize/main">http://personalenglish.org/ColorSize/main</a></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  <a href="https://github.com/StefanScott/UrWeb-colorSize">https://github.com/StefanScott/UrWeb-colorSize</a></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Contribution of the working, *non-meta-programming* example:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Previously, I had made a conjecture that the error in the present non-working, meta-programming example might have been due to attempting to put something of type `transaction xml` inside a `<form>`.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">However, the *non-meta-programming* example above (ColorSize) disproves this conjecture, because it *does* successfully insert something (`color_options_xml`) of type `transaction xml` into a `<form>` tag, here:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">---</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  <a href="https://github.com/StefanScott/UrWeb-colorSize/blob/master/colorSize.ur#L378-L381">https://github.com/StefanScott/UrWeb-colorSize/blob/master/colorSize.ur#L378-L381</a></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  color_options_xml <- </font></div><div><font face="monospace, monospace">(*^^^^^^^^^^^^^^^^^*)</font></div><div><font face="monospace, monospace">    queryX1 </font></div><div><font face="monospace, monospace">      ( SELECT * FROM color ORDER BY color.Nam)</font></div><div><font face="monospace, monospace">      ( fn r => <xml> <option> {[r.Nam]} </option> </xml> )</font></div><div><font face="monospace, monospace">  ;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">---</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  <a href="https://github.com/StefanScott/UrWeb-colorSize/blob/master/colorSize.ur#L399-L415">https://github.com/StefanScott/UrWeb-colorSize/blob/master/colorSize.ur#L399-L415</a></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  <form></font></div><div><font face="monospace, monospace">    <h2>Add a Thing:</h2></font></div><div><font face="monospace, monospace">    <table></font></div><div><font face="monospace, monospace">      <tr> <th>Name:</th>  <td> <textbox {#Nam} /> </td> </tr></font></div><div><font face="monospace, monospace">      <tr> <th>Color:</th> <td> <select  {#ColorNam} ></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        {color_options_xml}</font></div><div><font face="monospace, monospace">       (*^^^^^^^^^^^^^^^^^*)</font></div><div><font face="monospace, monospace">      </select> </td> </tr></font></div><div><font face="monospace, monospace">      (* ... *)</font></div><div><font face="monospace, monospace">      <tr> <th/> <td> <submit action={create} value="Add Thing !"/> </td> </tr></font></div><div><font face="monospace, monospace">    </table></font></div><div><font face="monospace, monospace">  </form></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">---</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">So the (working) *non-meta-programming* example <a href="https://github.com/StefanScott/UrWeb-colorSize">https://github.com/StefanScott/UrWeb-colorSize</a> shows that it is indeed possible to insert something of type `transaction xml` into a `<form>` tag - which indicates that the error in the present (non-working) *meta-programming* example UrWeb-crudWidgetTxn1 is being caused by something *else*.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Thanks for any help getting the present, meta-programming version to compile using result type `transaction xml` for `Widget`.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">###</font></div><div><br></div></div>