<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:st1="urn:schemas-microsoft-com:office:smarttags" 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 11 (filtered medium)">
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><o:SmartTagType
 namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="PostalCode"/>
<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
 name="State"/>
<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
 name="City"/>
<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
 name="place"/>
<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
 name="Street"/>
<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
 name="address"/>
<o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags"
 name="PersonName"/>
<!--[if !mso]>
<style>
st1\:*{behavior:url(#default#ieooui) }
</style>
<![endif]-->
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Verdana;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman";}
a:link, span.MsoHyperlink
        {color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {color:blue;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:Verdana;
        color:blue;
        font-weight:normal;
        font-style:normal;
        text-decoration:none none;}
@page Section1
        {size:595.3pt 841.9pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
        {page:Section1;}
-->
</style>

</head>

<body lang=EN-GB link=blue vlink=blue>

<div class=Section1>

<p class=MsoNormal><font size=2 color=blue face=Verdana><span style='font-size:
10.0pt;font-family:Verdana;color:blue'>Not only that, but when we have
associated type synonyms going it&#8217;ll be even clearer. &nbsp;Instead of<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=blue face=Verdana><span style='font-size:
10.0pt;font-family:Verdana;color:blue'><o:p>&nbsp;</o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'>class CoreProcessSyntax p a x | p -&gt; a x where <br>
&nbsp;&nbsp; zero :: p<br>
&nbsp;&nbsp; sequence :: a -&gt; x -&gt; p<br>
&nbsp;&nbsp; compose :: [p] -&gt; p<br>
<br>
<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'>you&#8217;ll be able to write<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'><o:p>&nbsp;</o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'>class CoreProcessSyntax p where <o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'>&nbsp;&nbsp; type AThing p :: *<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'>&nbsp;&nbsp; type XThing p :: *<br>
&nbsp;&nbsp; zero :: p<br>
&nbsp;&nbsp; sequence :: AThing p -&gt; XThing p -&gt; p<br>
&nbsp;&nbsp; compose :: [p] -&gt; p<br>
<br>
<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'>I&#8217;m not sure what the &#8216;a&#8217; and &#8216;x&#8217;
parameters stand for, but they are functionally dependent on &#8216;p&#8217;; I&#8217;ve
called these type functions AThing and XThing, but you&#8217;ll have more
meaningful names. &nbsp;Now the type of &#8216;sequence&#8217; is much rmore perspicuous.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'><o:p>&nbsp;</o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'>Simon<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'><o:p>&nbsp;</o:p></span></font></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'>

<div>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'><o:p>&nbsp;</o:p></span></font></p>

<div class=MsoNormal align=center style='text-align:center'><font size=3
face="Times New Roman"><span lang=EN-US style='font-size:12.0pt'>

<hr size=2 width="100%" align=center tabindex=-1>

</span></font></div>

<p class=MsoNormal><b><font size=2 face=Tahoma><span lang=EN-US
style='font-size:10.0pt;font-family:Tahoma;font-weight:bold'>From:</span></font></b><font
size=2 face=Tahoma><span lang=EN-US style='font-size:10.0pt;font-family:Tahoma'>
lgreg.meredith@gmail.com [mailto:lgreg.meredith@gmail.com] <b><span
style='font-weight:bold'>On Behalf Of </span></b>Greg Meredith<br>
<b><span style='font-weight:bold'>Sent:</span></b> 25 April 2007 04:27<br>
<b><span style='font-weight:bold'>To:</span></b> oleg@pobox.com; Simon
Peyton-Jones<br>
<b><span style='font-weight:bold'>Cc:</span></b> <st1:PersonName w:st="on">haskell-cafe</st1:PersonName>;
Matthias Radestock; Matthew Sackman; Tristan Allwood<br>
<b><span style='font-weight:bold'>Subject:</span></b> On reflection</span></font><span
lang=EN-US><o:p></o:p></span></p>

</div>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'><o:p>&nbsp;</o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'>Oleg, Simon, <br>
<br>
Thanks for your help. If i understand it correctly, the code below gives a
reasonably clean first cut at a demonstration of process calculi as
polymorphically parametric in the type of name, allowing for an instantiation
of the type in which the quoted processes play the role of name. This is much,
much cleaner and easier to read than the OCaml version. <br>
<br>
Best wishes,<br>
<br>
--greg<br>
<br>
{-# OPTIONS -fglasgow-exts -fallow-undecidable-instances #-}<br>
<br>
module Core(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nominal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,Name<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,Locality<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,Location<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,CoreProcessSyntax
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,CoreAgentSyntax<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,MinimalProcessSyntax<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,MinimalAgentSyntax<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,ReflectiveProcessSyntax<br>
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,make_process<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br>
&nbsp;&nbsp;&nbsp; where<br>
<br>
-- What's in a name? <br>
<br>
class Nominal n where<br>
&nbsp;&nbsp; nominate :: i -&gt; n i<br>
<br>
-- newtype Name i = Nominate i deriving (Eq, Show)<br>
newtype Name i = Name i deriving (Eq, Show)<br>
<br>
instance Nominal Name where nominate i = Name i<br>
<br>
-- Where are we?<br>
<br>
class Locality a where<br>
&nbsp;&nbsp; locate :: (Eq s, Nominal n) =&gt; s -&gt; (n i) -&gt; a s (n i)<br>
&nbsp;&nbsp; name :: (Eq s, Nominal n) =&gt; a s (n i) -&gt; (n i)<br>
<br>
-- data Location s n = Locate s n deriving (Eq, Show) <br>
data Location s n = Location s n deriving (Eq, Show)<br>
<br>
instance Locality Location where<br>
&nbsp; locate s n = Location s n<br>
&nbsp; name (Location s n) = n<br>
<br>
<br>
-- Constraints<br>
<br>
class CoreProcessSyntax p a x | p -&gt; a x where <br>
&nbsp;&nbsp; zero :: p<br>
&nbsp;&nbsp; sequence :: a -&gt; x -&gt; p<br>
&nbsp;&nbsp; compose :: [p] -&gt; p<br>
<br>
class CoreAgentSyntax x p n | x -&gt; p n where<br>
&nbsp;&nbsp; bind&nbsp; :: [n] -&gt; p -&gt; x<br>
&nbsp;&nbsp; offer :: [n] -&gt; p -&gt; x<br>
<br>
-- Freedom (as in freely generated) <br>
<br>
data MinimalProcessSyntax l x =<br>
&nbsp;&nbsp;&nbsp; Null<br>
&nbsp;&nbsp;&nbsp; | Sequence l x<br>
&nbsp;&nbsp;&nbsp; | Composition [MinimalProcessSyntax l x]<br>
<br>
data MinimalAgentSyntax n p =<br>
&nbsp;&nbsp;&nbsp; Thunk (() -&gt; p)<br>
&nbsp;&nbsp;&nbsp; | Abstraction ([n] -&gt; p)<br>
&nbsp;&nbsp;&nbsp; | Concretion [n] p<br>
<br>
-- Responsibility : constraining freedom to enjoy order<br>
<br>
instance CoreProcessSyntax (MinimalProcessSyntax l x) l x where<br>
&nbsp;&nbsp;&nbsp; zero = Null<br>
&nbsp;&nbsp;&nbsp; sequence l a = Sequence l a<br>
&nbsp;&nbsp;&nbsp; compose [] = zero <br>
&nbsp;&nbsp;&nbsp; compose ps = Composition ps<br>
<br>
instance CoreAgentSyntax (MinimalAgentSyntax n p) p n where<br>
&nbsp;&nbsp;&nbsp; bind [] proc = Thunk (\() -&gt; proc)<br>
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- TODO : lgm : need to substitute m for name
in proc<br>
&nbsp;&nbsp;&nbsp; bind (name:names) proc = Abstraction (\m -&gt; comp $ bind
names proc) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where comp (Thunk fp) = fp ()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-- comp (Abstraction abs) = abs name<br>
&nbsp;&nbsp;&nbsp; offer names proc = Concretion names proc<br>
<br>
data ReflectiveProcessSyntax =<br>
&nbsp;&nbsp;&nbsp; Reflect <br>
&nbsp;&nbsp;&nbsp; (MinimalProcessSyntax <br>
&nbsp;&nbsp;&nbsp;&nbsp; (Location [(Name ReflectiveProcessSyntax)] (Name
ReflectiveProcessSyntax)) <br>
&nbsp;&nbsp;&nbsp;&nbsp; (MinimalAgentSyntax (Name ReflectiveProcessSyntax)
ReflectiveProcessSyntax))<br>
<br>
-- instance (CoreProcessSyntax p a x) =&gt;<br>
--&nbsp;&nbsp;&nbsp;&nbsp; CoreProcessSyntax<br>
--&nbsp;&nbsp;&nbsp;&nbsp; (MinimalProcessSyntax<br>
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Location<br>
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [(Name (MinimalProcessSyntax a x))]<br>
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Name (MinimalProcessSyntax a x)))<br>
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (MinimalAgentSyntax<br>
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Name (MinimalProcessSyntax a x)) <br>
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (MinimalProcessSyntax a x)))<br>
--&nbsp;&nbsp;&nbsp;&nbsp; (Location<br>
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [(Name (MinimalProcessSyntax a x))]<br>
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Name (MinimalProcessSyntax a x)))<br>
--&nbsp;&nbsp;&nbsp;&nbsp; (MinimalAgentSyntax<br>
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Name (MinimalProcessSyntax a x)) <br>
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (MinimalProcessSyntax a x))<br
clear=all>
<br>
-- <br>
L.G. Meredith<br>
Managing Partner<br>
Biosimilarity LLC<br>
<st1:Street w:st="on"><st1:address w:st="on">505 N 72nd St</st1:address></st1:Street><br>
<st1:place w:st="on"><st1:City w:st="on">Seattle</st1:City>, <st1:State w:st="on">WA</st1:State>
 <st1:PostalCode w:st="on">98103</st1:PostalCode></st1:place><br>
<br>
+1 206.650.3740<br>
<br>
<a href="http://biosimilarity.blogspot.com">http://biosimilarity.blogspot.com</a>
<o:p></o:p></span></font></p>

</div>

</div>

</body>

</html>