<div dir="ltr"><div><font size="4">Note: A GitHub repo has been created containing the code for this question - and the README on the GitHub provides a much *better* formatted version of this question. You can access it here:</font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="https://github.com/StefanScott/urweb-queryX1-dyn">https://github.com/StefanScott/urweb-queryX1-dyn</a></font></div><div><font size="4"><br></font></div><div><font size="4">So, the README at the GitHub repo is exactly the *same* as the message below - but the GitHub README is much *easier* to read, since it has bold, italics, code font, and more links. So you might prefer to read this message on the GitHub repo!</font></div><div><font size="4"><br></font></div><div><font size="4">Thanks for any help getting this code to compile.</font></div><div><font size="4"><br></font></div><div><font size="4"><br></font></div><div><font size="4">Objective:</font></div><div><font size="4"><br></font></div><div><font size="4">I'm trying to create a minimal example of a page with a <ctextbox> which will allow the user to instantly filter the records displayed in an <xml> fragment below it, using:</font></div><div><font size="4"><br></font></div><div><font size="4">- Ur/Web's dynamic page generation / FRP (source, signal, <dyn>);</font></div><div><font size="4"><br></font></div><div><font size="4">- the function queryX1 from top.urs / top.ur;</font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="https://github.com/urweb/urweb/blob/master/lib/ur/top.urs#L205-L208">https://github.com/urweb/urweb/blob/master/lib/ur/top.urs#L205-L208</a></font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="https://github.com/urweb/urweb/blob/master/lib/ur/top.ur#L284-L289">https://github.com/urweb/urweb/blob/master/lib/ur/top.ur#L284-L289</a></font></div><div><font size="4"><br></font></div><div><font size="4">- Ur/Web's SQL LIKE operator.</font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="http://www.impredicative.com/pipermail/ur/2015-August/002189.html">http://www.impredicative.com/pipermail/ur/2015-August/002189.html</a></font></div><div><font size="4"><br></font></div><div><font size="4">This would provide simple "live" filtering of recordsets, and possibly also lay the groundwork for later developing a data-bound type-ahead / auto-complete widget.</font></div><div><font size="4"><br></font></div><div><font size="4">The page contains only the following two elements:</font></div><div><font size="4"><br></font></div><div><font size="4">(1) a <ctextbox source={theFilterSource}/></font></div><div><font size="4"><br></font></div><div><font size="4">(2) a function call `{showRows theFilterSource}` returning an <xml> fragment containing a <dyn signal={...}/> tag, which should either:</font></div><div><font size="4"><br></font></div><div><font size="4">- show all records from table `thing` (if `theFilterSource = ""`);</font></div><div><font size="4"><br></font></div><div><font size="4">- otherwise, show only filtered records from table `thing` - ie:</font></div><div><font size="4"><br></font></div><div><font size="4">`SELECT thing.Nam FROM thing WHERE thing.Nam LIKE {[aFilterString]}`</font></div><div><font size="4"><br></font></div><div><font size="4"><br></font></div><div><font size="4">Previous, related work:</font></div><div><font size="4"><br></font></div><div><font size="4">The code connecting the source and the signal is closely modeled on:</font></div><div><font size="4"><br></font></div><div><font size="4">(1) the Ur/Web Increment and Batch demos;</font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="http://www.impredicative.com/ur/demo/increment.html">http://www.impredicative.com/ur/demo/increment.html</a></font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="http://www.impredicative.com/ur/demo/batch.html">http://www.impredicative.com/ur/demo/batch.html</a></font></div><div><font size="4"><br></font></div><div><font size="4">(2) the Ur/Web <cselect> test;</font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="https://github.com/urweb/urweb/blob/master/tests/cselect.ur">https://github.com/urweb/urweb/blob/master/tests/cselect.ur</a><br></font></div><div><font size="4"><br></font></div><div><font size="4">(3) a very minimal (and correctly working) Ur/Web FRP example urweb-ctextbox-echo:</font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="https://github.com/StefanScott/urweb-ctextbox-echo">https://github.com/StefanScott/urweb-ctextbox-echo</a></font></div><div><font size="4"><br></font></div><div><font size="4">which just instantly echoes the contents of a <ctextbox>, directly below the <ctextbox> itself.</font></div><div><font size="4"><br></font></div><div><font size="4"><br></font></div><div><font size="4">Results:</font></div><div><font size="4"><br></font></div><div><font size="4">The compile error says `Have: xml` vs `Need: transaction` for</font><span style="font-size:large"> lines 27-33 in file queryX1dyn.ur:</span></div><div><font size="4"><br></font></div><div><font size="4">  <a href="https://github.com/StefanScott/urweb-queryX1-dyn/blob/master/queryX1dyn.ur#L27-L33">https://github.com/StefanScott/urweb-queryX1-dyn/blob/master/queryX1dyn.ur#L27-L33</a></font></div><div><font size="4"><br></font></div><div><font size="4" face="monospace, monospace">    <xml><dyn signal=</font></div><div><font size="4" face="monospace, monospace">      { aFilterSignal <- signal aFilterSource</font></div><div><font size="4" face="monospace, monospace">        ;</font></div><div><font size="4" face="monospace, monospace">        return</font></div><div><font size="4" face="monospace, monospace">        ( showRows' aFilterSignal )</font></div><div><font size="4" face="monospace, monospace">      } </font></div><div><font size="4" face="monospace, monospace">    /></xml></font></div><div><font size="4" face="monospace, monospace">  end</font></div><div><font size="4"><br></font></div><div><font size="4"><br></font></div><div><font size="4">Remarks:</font></div><div><font size="4"><br></font></div><div><font size="4">(1) Looking at queryX1 in top.urs / top.ur, I believe that the result type of `fun showRows aFilterSource` is `transaction xml`.</font></div><div><font size="4"><br></font></div><div><font size="4">Questions:</font></div><div><font size="4"><br></font></div><div><font size="4">(1) Is the result type of `( showRows' aFilterSignal )` (apparently `transaction xml`) compatible with all three of the following parent / containing "contexts" listed below?</font></div><div><font size="4"><br></font></div><div><font size="4">(a) what is expected by the <dyn signal={...}> tag containing this function call; and/or</font></div><div><font size="4"><br></font></div><div><font size="4">(b) what is expected by the "parent" <xml> tag containing the <dyn> tag; and/or</font></div><div><font size="4"><br></font></div><div><font size="4">(c) what is expected by the <xml><body> tag in the main function where this value is used.</font></div><div><font size="4"><br></font></div><div><font size="4">(2) Does Ur/Web impose some (general, universal) restriction on the result type of the code used in a <dyn signal={...}> tag?</font></div><div><font size="4"><br></font></div><div><font size="4">It seems very possible to me that answering the above questions might help to understand (and resolve) the compile error - reproduced in full further below, and also at the following anchor link on the GitHub README:</font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="https://github.com/StefanScott/urweb-queryX1-dyn#compile_error">https://github.com/StefanScott/urweb-queryX1-dyn#compile_error</a><br></font></div><div><font size="4"><br></font></div><div><font size="4"><br></font></div><div><font size="4">Similarities and differences between queryX1dyn.ur and previous work:</font></div><div><font size="4"><br></font></div><div><font size="4">Similarities:</font></div><div><font size="4"><br></font></div><div><font size="4">(1) The `showRows` function (and its auxiliary `showRows'` function) in queryX1dyn.ur are very closely modeled on the `show` function (and its auxiliary `show'` function) in the Ur/Web Batch demo.</font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="https://github.com/StefanScott/urweb-queryX1-dyn/blob/master/queryX1dyn.ur#L5-L34">https://github.com/StefanScott/urweb-queryX1-dyn/blob/master/queryX1dyn.ur#L5-L34</a></font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="https://github.com/urweb/urweb/blob/master/demo/batch.ur#L21-L39">https://github.com/urweb/urweb/blob/master/demo/batch.ur#L21-L39</a></font></div><div><font size="4"><br></font></div><div><font size="4">For more details, see "An interesting idiom" at this anchor link:</font></div><div><font size="4"><br></font></div><div><font size="4"><a href="https://github.com/StefanScott/urweb-queryX1-dyn#observation_1">https://github.com/StefanScott/urweb-queryX1-dyn#observation_1</a><br></font></div><div><font size="4"><br></font></div><div><font size="4"><br></font></div><div><font size="4">Differences:</font></div><div><font size="4"><br></font></div><div><font size="4">(1) The `show` function in the Ur/Web Batch demo apparently has result type:</font></div><div><font size="4"><br></font></div><div><font size="4">  xml</font></div><div><font size="4"><br></font></div><div><font size="4">while the `show` function in queryX1dyn.ur apparently has result type:</font></div><div><font size="4"><br></font></div><div><font size="4">  transaction xml</font></div><div><font size="4"><br></font></div><div><font size="4">This might be a problem (and it might actually be the cause of the compile error reproduced below), but I'm unsure whether (or how) to change this.</font></div><div><font size="4"><br></font></div><div><font size="4">(2) The Batch demo involves a <button> with an `onclick` event and the Increment demo also involves a <button> with an `onclick` event.</font></div><div><font size="4"><br></font></div><div><font size="4">The present example queryX1dyn is different in two ways:</font></div><div><font size="4"><br></font></div><div><font size="4">(a) Instead of having a <button> on the page, it has a <ctextbox source={theFilterSource}/>, which receives the user's input, thus automatically changing `theFilterSource`.</font></div><div><font size="4"><br></font></div><div><font size="4">(b) The `onclick` event in the Increment and Batch demos also *writes* some data on the server (batch-inserting records, or incrementing a sequence, respectively).</font></div><div><font size="4"><br></font></div><div><font size="4">But the present project queryX1dyn does not *write* any data on the server: it merely *reads* some data from the server.</font></div><div><font size="4"><br></font></div><div><font size="4">(Of course, even though the demos do a "write" while the present project merely does a "read", both the "read" and the "write" are still transactional, since they both involve accessing the database on the server.)</font></div><div><font size="4"><br></font></div><div><font size="4">Therefore, it makes sense that:</font></div><div><font size="4"><br></font></div><div><font size="4">- the `onclick` event of the <button> in the Batch demo, and</font></div><div><font size="4"><br></font></div><div><font size="4">- the `onclick` event of the <button> in the Increment demo</font></div><div><font size="4"><br></font></div><div><font size="4">would both be somewhat "longer", involving an initial `rpc` call (to write the data on the server), lacking in the present project.</font></div><div><font size="4"><br></font></div><div><font size="4">Summarizing, there are two differences between the present example queryX1dyn and the Batch and Increment demos:</font></div><div><font size="4"><br></font></div><div><font size="4">- the <ctextbox> does not have an `on_` event (since, as the previous minimal example `urweb-ctextbox-echo` demonstrates, in the case of a <ctextbox> the source updates the signal automatically, with no need for, eg, an `onkeyup` event); and</font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="https://github.com/StefanScott/urweb-ctextbox-echo">https://github.com/StefanScott/urweb-ctextbox-echo</a></font></div><div><font size="4"><br></font></div><div><font size="4">- the <ctextbox> in the present example does not perform an `rpc` call (since I believe this is unnecessary, because data is only read from the server-side, not written to the server-side).</font></div><div><font size="4"><br></font></div><div><font size="4"><br></font></div><div><font size="4">Compile error message `Have: xml` vs `Need: transaction`:</font></div><div><font size="4"><br></font></div><div><font size="4">The complete compile error message is reproduced here:</font></div><div><font size="4"><br></font></div><div><font size="4" face="monospace, monospace">$ urweb -dbms postgres -db "host=localhost port=5432 user=scott password='pw' dbname=queryx1_dyn" queryX1dyn</font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">queryX1dyn.ur:27:13: (to 33:8) Error in final record unification</font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">Can't unify record constructors</font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">   Have: </font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">[Signal =</font></div><div><font size="4" face="monospace, monospace">  signal (xml ([Dyn = (), Body = (), MakeForm = ()]) ([]) ([]))]</font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">   Need: </font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace"><UNIF:U284::{Type}> ++</font></div><div><font size="4" face="monospace, monospace"> [Signal =</font></div><div><font size="4" face="monospace, monospace">   signal</font></div><div><font size="4" face="monospace, monospace">    (transaction</font></div><div><font size="4" face="monospace, monospace">      (xml (([Body = ()]) ++ <UNIF:U86::{Unit}>) <UNIF:O::{Type}></font></div><div><font size="4" face="monospace, monospace">        ([])))]</font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">  Field:  #Signal</font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">Value 1: </font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">signal (xml ([Dyn = (), Body = (), MakeForm = ()]) ([]) ([]))</font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">Value 2: </font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">signal</font></div><div><font size="4" face="monospace, monospace"> (transaction</font></div><div><font size="4" face="monospace, monospace">   (xml (([Body = ()]) ++ <UNIF:U86::{Unit}>) <UNIF:O::{Type}> ([])))</font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">Incompatible constructors</font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">Have:  xml ([Dyn = (), Body = (), MakeForm = ()]) ([])</font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">Need:  transaction</font></div><div><font size="4" face="monospace, monospace"><br></font></div><div><font size="4" face="monospace, monospace">$ </font></div><div><font size="4"><br></font></div><div><font size="4"><br></font></div><div><font size="4">Possible cause(s) of error:</font></div><div><font size="4"><br></font></div><div><font size="4">(1) Expected types in various contexts? (more likely)</font></div><div><font size="4"><br></font></div><div><font size="4">We can see that there is a record unification error involving incompatible constructors `Have: xml` vs `Need: transaction`.</font></div><div><font size="4"><br></font></div><div><font size="4">This apparently involves the signal attribute of the <dyn> tag - which means it might also involve:</font></div><div><font size="4"><br></font></div><div><font size="4">- what is expected by the <dyn signal={...}> tag containing this function call; and/or</font></div><div><font size="4"><br></font></div><div><font size="4">- what is expected by the "parent" <xml> tag containing the <dyn> tag; and/or</font></div><div><font size="4"><br></font></div><div><font size="4">- what is expected by the <xml><body> tag in the main function where this value is used; and/or</font></div><div><font size="4"><br></font></div><div><font size="4">- some possible (general, universal) Ur/Web restriction on the result type of the code used in a <dyn signal={...}> tag.</font></div><div><font size="4"><br></font></div><div><font size="4">(2) Need to perform an `rpc` call? (less likely)</font></div><div><font size="4"><br></font></div><div><font size="4">Because the present project is closely modeled on the Ur/Web Increment and Batch demos, I am fairly sure that the connection between the source and the signal has been established correctly.</font></div><div><font size="4"><br></font></div><div><font size="4">However, I am not completely sure about this, since there are a couple of differences between the present project and those demos:</font></div><div><font size="4"><br></font></div><div><font size="4">(a) The demos involve a <button> with an `onclick` event, while the present project involves a <ctextbox> with no event.</font></div><div><font size="4"><br></font></div><div><font size="4">However, I believe that in the case of a <ctextbox> having a `source` attribute, no `on_` event is necessary - as apparently demonstrated by the very minimal (and correctly working) Ur/Web FRP example urweb-ctextbox-echo.</font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="https://github.com/StefanScott/urweb-ctextbox-echo">https://github.com/StefanScott/urweb-ctextbox-echo</a></font></div><div><font size="4"><br></font></div><div><font size="4">(b) The `onclick` event in the demos also performs an `rpc` call, while the present project does not.</font></div><div><font size="4"><br></font></div><div><font size="4">However, I believe that no `rpc` call is necessary in the present project, because this project only *reads* data from the server, while the demos *write* data on the server.</font></div><div><font size="4"><br></font></div><div><font size="4">Again, I am not completely certain that no `rpc` call is needed in the present project - because although this project does not perform a (transactional) "write" on the server, it does perform a (transactional) "read" on the server.</font></div><div><font size="4"><br></font></div><div><font size="4">(3) Likely cause of error:</font></div><div><font size="4"><br></font></div><div><font size="4">It seems more likely that the error has a simpler cause - not involving some mis-connection in the "wiring" between the source and the signal, but instead involving:</font></div><div><font size="4"><br></font></div><div><font size="4">- (most likely, since the compile error complains about lines 27-33 of queryX1dyn.ur) a conflict between the type of the value `return ( showRows' aFilterSignal )` versus what the <dyn> tag in function `showRows` expects (or what some "parent" <xml> fragment within that same function expects); or</font></div><div><font size="4"><br></font></div><div><font size="4">  <a href="https://github.com/StefanScott/urweb-queryX1-dyn/blob/master/queryX1dyn.ur#L27-L33">https://github.com/StefanScott/urweb-queryX1-dyn/blob/master/queryX1dyn.ur#L27-L33</a><br></font></div><div><font size="4"><br></font></div><div><font size="4">- (less likely, because the compile error doesn't mention these lines?) possibly some incompatibility between `{showRows theFilterSource}` and what the <xml> in the `main` function expects.</font></div><div><font size="4"><br></font></div><div><font size="4">Thanks for any help getting this to work!</font></div><div><font size="4"><br></font></div><div><font size="4">###</font></div></div>