<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="SV" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US">Dear all, I have tried to adapt ListEdit.ur in the tutorial to a small SVG application that adds circles to the screen as you double click (the code is at the end). The SVG.urs is found at
<a href="https://github.com/karsar/urweb-examples/blob/master/SVGTest/SVG.urs">https://github.com/karsar/urweb-examples/blob/master/SVGTest/SVG.urs</a><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I get a problem at row 57 “<dyn signal={circleDraw p}/>” and also at line 22 “show' (pl : plist) : signal xsvg   =” where the compiler gets stuck on “Error in final record unification<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Can't unify record constructors”. My hypothesis is that there is some problem between html and SVG.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">An excerpt of the error messages sis:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">/home/a/SVGTest5/SVGTest.ur:57:3: (to 58:8) Error in final record unification<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Can't unify record constructors<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Have:  <UNIF:U571::{Unit}> ++ [Dyn = ()]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Need:  [Svg = ()]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">/home/a/SVGTest5/SVGTest.ur:57:3: (to 58:8) Stuck unifying these records after canceling matching pieces:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Have:  ([Dyn = ()]) ++ <UNIF:U571::{Unit}><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Need:  [Svg = ()]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">/home/a/SVGTest5/SVGTest.ur:57:10: (to 57:30) Error in final record unification<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Can't unify record constructors<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   Have: <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">[Signal =<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  signal (xml (([Dyn = ()]) ++ <UNIF:U571::{Unit}>) ([]) ([]))]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   Need: <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><UNIF:U550::{Type}> ++ [Signal = signal (xml ([Svg = ()]) ([]) ([]))]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  Field:  #Signal<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Value 1: <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">signal (xml (([Dyn = ()]) ++ <UNIF:U571::{Unit}>) ([]) ([]))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Value 2:  signal (xml ([Svg = ()]) ([]) ([]))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Can't unify record constructors<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Have:  <UNIF:U571::{Unit}> ++ [Dyn = ()]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Need:  [Svg = ()]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">/home/a/SVGTest5/SVGTest.ur:22:10: (to 22:22) Error in final record unification<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Can't unify record constructors<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Have:  <UNIF:U168::{Unit}> ++ [Dyn = ()]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Need:  [Svg = ()]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">/home/a/SVGTest5/SVGTest.ur:22:10: (to 22:22) Stuck unifying these records after canceling matching pieces:<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Have:  ([Dyn = ()]) ++ <UNIF:U168::{Unit}><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Need:  [Svg = ()]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">/home/a/SVGTest5/SVGTest.ur:26:9: (to 26:35) Error in final record unification<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Can't unify record constructors<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   Have: <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">[Signal =<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  signal (xml (([Dyn = ()]) ++ <UNIF:U168::{Unit}>) ([]) ([]))]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">   Need: <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><UNIF:U147::{Type}> ++ [Signal = signal (xml ([Svg = ()]) ([]) ([]))]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">  Field:  #Signal<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Value 1: <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">signal (xml (([Dyn = ()]) ++ <UNIF:U168::{Unit}>) ([]) ([]))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Value 2:  signal (xml ([Svg = ()]) ([]) ([]))<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Can't unify record constructors<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Have:  <UNIF:U168::{Unit}> ++ [Dyn = ()]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Need:  [Svg = ()]<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">===== CODE =====<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">open SVG<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">datatype plist = Nil | Cons of {Point : source (int*int),<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                                                                                    Tail: source plist}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">     <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">(*con intPair = int*int*)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal">fun fst (x: int*int) = x.1<o:p></o:p></p>
<p class="MsoNormal">fun snd (x: int*int) = x.2<o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US">fun circleDraw x : signal xsvg  =<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    x' <- signal x;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    return<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                             <xml><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                 <circle cx={show ((fst x')-60)} cy={show ((snd x')-100)} r="10" stroke="red" fill="blue"/><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                             </xml><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">fun show (pl: source plist) : signal xsvg   =<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    pl <- signal pl;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    show' pl<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">and show' (pl : plist) : signal xsvg   =<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    case pl of<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                             Nil => return <xml/><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                             | Cons {Point = p, Tail = t } => return <xml><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                 <dyn signal={circleDraw p}/><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                             </xml><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                             <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">fun proc () =<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    l <- source Nil;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    </span>tailP <- source l;<o:p></o:p></p>
<p class="MsoNormal"><span lang="EN-US">    point <- source (0,0);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    let<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                             fun add () =<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                 p <- get point;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                 p' <- source p;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                 tail <- get tailP;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                 tail' <- source Nil;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                 let<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                          val cons = Cons {Point = p', Tail = tail'}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                 in<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                          set tail cons;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                          set tailP tail';<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                          l' <- get l;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                          case l' of<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                              Nil => set l cons<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                            | _ => return ()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                 end<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    in<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                             return<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                 <xml><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                   <body ondblclick={fn ev => set point (ev.ScreenX,ev.ScreenY); add()}><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                          <div style="width:800; heigth:800"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                            <svg width="800" height="600"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                              <dyn signal={show l}/><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                            </svg><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                          </div><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                   </body><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">            </xml><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    end<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                                           
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">fun main()  =<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    xml <- proc ();<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">    return<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                             <xml><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                               <head><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                 Banzai<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                               </head><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">                                 </span>{xml}<o:p></o:p></p>
<p class="MsoNormal">                             </xml><o:p></o:p></p>
<p class="MsoNormal">    <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>