<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>