<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Grammarware, Haskellware, XMLware</title><link>http://blogs.msdn.com/ralflammel/default.aspx</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>New, more personal blog</title><link>http://blogs.msdn.com/ralflammel/archive/2009/08/25/new-more-personal-blog.aspx</link><pubDate>Tue, 25 Aug 2009 15:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9883605</guid><dc:creator>RalfLammel</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/9883605.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=9883605</wfw:commentRss><description>&lt;p&gt;You can meet me here, too:&lt;/p&gt;&lt;p&gt;&lt;a href="http://professor-fish.blogspot.com/2009/08/same-guy-as-grammarware-haskellware.html" title="http://professor-fish.blogspot.com/2009/08/same-guy-as-grammarware-haskellware.html" mce_href="http://professor-fish.blogspot.com/2009/08/same-guy-as-grammarware-haskellware.html"&gt;http://professor-fish.blogspot.com/2009/08/same-guy-as-grammarware-haskellware.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Regards,&lt;/p&gt;&lt;p&gt;Ralf&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9883605" width="1" height="1"&gt;</description></item><item><title>API migration alive and kicking strongly</title><link>http://blogs.msdn.com/ralflammel/archive/2009/07/19/api-migration-alive-and-kicking-strongly.aspx</link><pubDate>Sun, 19 Jul 2009 02:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9839171</guid><dc:creator>RalfLammel</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/9839171.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=9839171</wfw:commentRss><description>
&lt;p&gt;I have been &lt;b&gt;talking&lt;/b&gt; about API migration a lot lately.&lt;/p&gt;

&lt;p&gt;I have even a draft paper in limbo ... &lt;i&gt;so much&lt;/i&gt; in limbo that I don't even link to it here.&lt;/p&gt;

&lt;p&gt;In fact, I admit that it is very difficult to get anything done scientifically and practically on this topic.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Thanks to some recent collaboration, there are some cool results and a new draft paper.&lt;/p&gt;

&lt;p&gt;Feedback very much appreciated.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Regards,&lt;/p&gt;

&lt;p&gt;Ralf&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.uni-koblenz.de/%7Elaemmel/xomjdom/" title="http://www.uni-koblenz.de/~laemmel/xomjdom/" mce_href="http://www.uni-koblenz.de/~laemmel/xomjdom/"&gt;http://www.uni-koblenz.de/~laemmel/xomjdom/&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;Transcript of an API migration for two XML APIs&lt;/h3&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;b&gt; Status &lt;/b&gt;
&lt;/dt&gt;&lt;dd&gt;
&lt;ul&gt;
&lt;li&gt; Paper submitted for publication
  &lt;/li&gt;

&lt;li&gt; Wrapper implementation uploaded&lt;/li&gt;
&lt;/ul&gt;

&lt;/dd&gt;&lt;dt&gt;&amp;nbsp;&lt;/dt&gt;&lt;dt&gt;&lt;b&gt;Authors&lt;/b&gt;
&lt;/dt&gt;&lt;dd&gt; Thiago Tonelli Bartolomei and Krzysztof Czarnecki and Ralf Lämmel and Tijs van der Storm
&lt;/dd&gt;&lt;dd&gt;&amp;nbsp;&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;Abstract&lt;/b&gt;
&lt;/dt&gt;&lt;dd&gt;
  API migration refers to the problem of adapting an application such
  that the usage of a given API (the source API) is replaced by the
  usage of an alternative API (the target API) serving the same
  domain. One may attempt to automate API migration by wrapping or
  some form of (source- or byte-) code transformation. API migration
  is relatively well understood for the special case where source and
  target APIs are essentially different versions of the same API. API
  migration is much less understood for the more general case where
  source API and target API have been developed more or less
  independently of each other. The present paper exercises a simple
  instance of the general case and develops engineering techniques
  towards the mastery of API migration. That is, a wrapper-based
  migration between two prominent XML APIs for the Java platform is
  studied where the various differences between the chosen APIs are
  identified, classified and counted in a systematic manner.
  
&lt;p&gt;
  &lt;!--
&lt;DT&gt;&lt;B&gt;Keywords&lt;/B&gt;
&lt;DD&gt;
T.B.D.

&lt;P&gt;
--&gt;
  
&lt;/p&gt;
&lt;/dd&gt;&lt;/dl&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9839171" width="1" height="1"&gt;</description></item><item><title>SYB goes Prolog</title><link>http://blogs.msdn.com/ralflammel/archive/2009/06/30/syb-goes-prolog.aspx</link><pubDate>Wed, 01 Jul 2009 00:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9810078</guid><dc:creator>RalfLammel</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/9810078.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=9810078</wfw:commentRss><description>&lt;p&gt;I am about to finish a short article on SYB in Prolog.&lt;/p&gt;&lt;p&gt;Deadline seems to be in 30 hours from now.&lt;/p&gt;&lt;p&gt;If anyone has suggestions, I'd appreciate it.&lt;/p&gt;&lt;p&gt;Thanks,&lt;/p&gt;&lt;p&gt;Ralf&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.uni-koblenz.de/%7Elaemmel/OdeToProlog/" title="http://www.uni-koblenz.de/~laemmel/OdeToProlog/" mce_href="http://www.uni-koblenz.de/~laemmel/OdeToProlog/"&gt;http://www.uni-koblenz.de/~laemmel/OdeToProlog/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h1&gt;Scrap Your Boilerplate---Prologically!&lt;/h1&gt;

&lt;dl&gt;&lt;dt&gt;&lt;b&gt; Status (30 June 2009) &lt;/b&gt;
&lt;/dt&gt;&lt;dd&gt;
  Paper available in draft form.
  &lt;br&gt;
  Code distribution not yet available online.
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;Author(s)&lt;/b&gt;
&lt;/dt&gt;&lt;dd&gt; Ralf Lämmel
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;Abstract&lt;/b&gt;
&lt;/dt&gt;&lt;dd&gt;
  
  ``Scrap Your Boilerplate'' (SYB) is an established style of generic
  functional programming. The present paper reconstructs SYB within
  the Prolog language with the help of the univ operator and
  higher-order logic programming techniques. We pay attention to the
  particularities of Prolog. For instance, we deal with traversal of
  non-ground terms. We also develop an alternative model of SYB-like
  traversal based on metaprogramming. This generative, type-driven
  model is also amenable to type-driven optimization.
  
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;Keywords&lt;/b&gt;
&lt;/dt&gt;&lt;dd&gt;
Scrap Your Boilerplate, Haskell, Prolog, Stratego.  
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;b&gt; Bibtex entry &lt;/b&gt;
&lt;/dt&gt;&lt;dd&gt;
&lt;pre&gt;@inproceedings{OdeToProlog,&lt;br&gt; author = "Ralf L{\"a}mmel",&lt;br&gt; title = "{Scrap Your Boilerplate---Prologically!}",&lt;br&gt; booktitle = "Proceedings of the 11th ACM SIGPLAN international conference on Principles and practice of declarative programming",&lt;br&gt; publisher = ACM,&lt;br&gt; year = 2009,&lt;br&gt; note = "6 pages"&lt;br&gt;}&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;Downloads&lt;/b&gt;
&lt;/dt&gt;&lt;dd&gt;
&lt;ul&gt;&lt;li&gt; Draft paper: &lt;a href="http://www.uni-koblenz.de/%7Elaemmel/OdeToProlog/paper.pdf"&gt;[.pdf]&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;



&lt;/dd&gt;&lt;/dl&gt;

&lt;br&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9810078" width="1" height="1"&gt;</description></item><item><title>retweewter</title><link>http://blogs.msdn.com/ralflammel/archive/2009/06/08/retweewter.aspx</link><pubDate>Mon, 08 Jun 2009 21:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9708633</guid><dc:creator>RalfLammel</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/9708633.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=9708633</wfw:commentRss><description>&lt;p&gt;retweewter V1 (C) 2009 Ralf Laemmel &lt;br&gt;&lt;br&gt;README&lt;br&gt;&lt;br&gt;What is that retweewter?&lt;br&gt;&lt;br&gt;retweewter is a Twitter application. It is a toy application. It's&lt;br&gt;absolutely useless, equally redundant and nearly dysfunctional, but it&lt;br&gt;is fun doing this sort of code and app, and the author will keep it&lt;br&gt;alive for some time (such as mins to days) until he lacks further&lt;br&gt;interest or faces the outburst of unsatisfied users.&lt;br&gt;&lt;br&gt;retweewter runs (or could run) continuously to retweet certain search&lt;br&gt;results to a designated user. The relevant tweets are identified by&lt;br&gt;(hashed) search strings. With retweewter, some community can agree on&lt;br&gt;a specific tag to be used throughout their messages and thereby&lt;br&gt;trigger those tweets to be aggregated on an designated twitter&lt;br&gt;account.&lt;br&gt;&lt;br&gt;If this readme is up-to-date, then it is true that the author of&lt;br&gt;retweewter actually runs one installation of the app that can serve a&lt;br&gt;number of communities as described above. If you like to be covered by&lt;br&gt;that server (without any warranty and liability on the author's site),&lt;br&gt;please send the "input" as described below.&lt;br&gt;&lt;br&gt;&lt;br&gt;What input is needed for setting up retweewter (retweeting) for you?&lt;br&gt;&lt;br&gt;&amp;nbsp;- user: the Twitter user to whom retweets go as updates&lt;br&gt;&amp;nbsp;- password: the password of the user (needed by the app clearly)&lt;br&gt;&amp;nbsp;- tag: search string (the heading "#" is added if it's not there)&lt;br&gt;&lt;br&gt;See the FAQ for ways of submitting that information.&lt;br&gt;(See contacting the author.)&lt;br&gt;&lt;br&gt;&lt;br&gt;How should I think of retweewter's behavior?&lt;br&gt;&lt;br&gt;&amp;nbsp;- retweewter only checks every few minutes or so for new&lt;br&gt;&amp;nbsp;&amp;nbsp; tweets. (Most of the time retweewter is sleeping.) It depends on&lt;br&gt;&amp;nbsp;&amp;nbsp; the search function of Twitter to find tweets that involve the hash&lt;br&gt;&amp;nbsp;&amp;nbsp; string. Because of that, there may be some additional delay.&lt;br&gt;&amp;nbsp;&amp;nbsp; Use some proper software instead of retweewter if you can't wait.&lt;br&gt;&lt;br&gt;&amp;nbsp;- retweewter uses the Twitter API in a manner that it only looks at a&lt;br&gt;&amp;nbsp;&amp;nbsp; small window of tweets. The current version does not use any paging&lt;br&gt;&amp;nbsp;&amp;nbsp; and database support. The way retweewter is configured it could&lt;br&gt;&amp;nbsp;&amp;nbsp; miss tweets if there are many (say 10, perhaps even less) within&lt;br&gt;&amp;nbsp;&amp;nbsp; the turn around cycle of retweewter. That's entirely your problem.&lt;br&gt;&lt;br&gt;&amp;nbsp;- retweewter tries to identify retweets that are no longer&lt;br&gt;&amp;nbsp;&amp;nbsp; appropriate because the underlying tweet (from which the RT was&lt;br&gt;&amp;nbsp;&amp;nbsp; generated) is gone. This feature is pretty experimental. It is&lt;br&gt;&amp;nbsp;&amp;nbsp; entirely possible that the windowing approach of retweewter causes&lt;br&gt;&amp;nbsp;&amp;nbsp; false positives and negatives. In fact, this whole deletion&lt;br&gt;&amp;nbsp;&amp;nbsp; business made the experiment somehwat interesting.&lt;br&gt;&lt;br&gt;&lt;br&gt;More Frequently Asked Questions&lt;br&gt;&lt;br&gt;&amp;nbsp;- Is retweewter free software or what? You are free to try using&lt;br&gt;&amp;nbsp;&amp;nbsp; it. You are not supposed to pay me anything or anyone for this app.&lt;br&gt;&amp;nbsp;&amp;nbsp; I might eventually publish the sources, and if so, the software is&lt;br&gt;&amp;nbsp;&amp;nbsp; even more free.&lt;br&gt;&lt;br&gt;&amp;nbsp;- Is retweewter developed in Haskell or what? It should have been&lt;br&gt;&amp;nbsp;&amp;nbsp; clearly! The only reason that it was done in Java is that I am&lt;br&gt;&amp;nbsp;&amp;nbsp; using Twitter programming in my Java-based advanced programming&lt;br&gt;&amp;nbsp;&amp;nbsp; class and those students are clever enough to tell Haskell by the&lt;br&gt;&amp;nbsp;&amp;nbsp; file extensions of the programs.&lt;br&gt;&lt;br&gt;&amp;nbsp;- How can I contact the author of retweewter and stay in touch with&lt;br&gt;&amp;nbsp;&amp;nbsp; the irrelevant details of retweewter's future? You can use the tag&lt;br&gt;&amp;nbsp;&amp;nbsp; #retweewter in order to be retweeted to @retweewter, or you reply&lt;br&gt;&amp;nbsp;&amp;nbsp; to @retweewter, and you may as well follow @retweewter. You can as&lt;br&gt;&amp;nbsp;&amp;nbsp; well bother the author directly -- this is @notquiteabba.&lt;br&gt;&lt;br&gt;&amp;nbsp;- Can't you think of a more convenient way for registering with&lt;br&gt;&amp;nbsp;&amp;nbsp; retweewter? Sure I can, but this application isn't serious at all.&lt;br&gt;&amp;nbsp;&amp;nbsp; If I end up getting users, I need to work on scalability -- for&lt;br&gt;&amp;nbsp;&amp;nbsp; which I simply don't have time. However, I might add a&lt;br&gt;&amp;nbsp;&amp;nbsp; twitter-based subscription feature anyway. More likely, I will&lt;br&gt;&amp;nbsp;&amp;nbsp; discontinue retweewter very soon.&lt;br&gt;&lt;br&gt;&lt;br&gt;Thanks,&lt;br&gt;Ralf Laemmel&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9708633" width="1" height="1"&gt;</description></item><item><title>Transformer goes Braga/Portugal: 06-11 July -- GTTSE 2009</title><link>http://blogs.msdn.com/ralflammel/archive/2009/05/31/transformer-goes-braga-portugal-06-11-july-gttse-2009.aspx</link><pubDate>Sun, 31 May 2009 14:28:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9668793</guid><dc:creator>RalfLammel</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/9668793.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=9668793</wfw:commentRss><description>&lt;p&gt;So we are looking forward &lt;span style="font-weight: bold;"&gt;8 "long" tutorials on different parts of the transformation/generation space of software engineering&lt;/span&gt;. For example, Bran Selic will stand in for model-based engineering and Jim Cordy will sketch his ultimate TXL cookbook. See the full program below. In addition, we will host a &lt;span style="font-weight: bold;"&gt;"research 2.0"&lt;/span&gt; event with Jean-Marie Favre and his companion Denis Avrilionis of One Tree Technologies as the moderators or speakers. Yet in addition, there are &lt;span style="font-weight: bold;"&gt;another 6 short tutorials&lt;/span&gt;. We are also in the process of putting together a participants' workshop. Combined with the social program, this will be a packed week as in previous years.&lt;/p&gt;&lt;p&gt;At this point, we have 80+ registered participants. &lt;br&gt;&lt;/p&gt;&lt;p&gt;REGISTRATION DEADLINE:&lt;br&gt;
June 7&lt;br&gt;&lt;/p&gt;&lt;p&gt;The Call for Participation follows.&lt;/p&gt;&lt;p&gt;Regards,&lt;/p&gt;&lt;p&gt;Ralf&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;GTTSE 2009, 06-11 July, 2009, Braga, Portugal&lt;br&gt;&lt;br&gt;3rd International Summer School on&lt;br&gt;Generative and Transformational Techniques in Software Engineering&lt;br&gt;&lt;br&gt;http://gttse.wikidot.com/&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;REGISTRATION DEADLINE:&lt;br&gt;

June 7&lt;br&gt;
&lt;/p&gt;&lt;p&gt;&lt;br&gt;SCOPE AND FORMAT&lt;br&gt;&lt;br&gt;The summer school brings together PhD students, lecturers, technology&lt;br&gt;presenters, as well as other researchers and practitioners who are&lt;br&gt;interested in the generation and the transformation of programs, data,&lt;br&gt;models, meta-models, and documentation. This concerns many areas of&lt;br&gt;software engineering: software reverse and re-engineering,&lt;br&gt;model-driven approaches, automated software engineering, generic&lt;br&gt;language technology, to name a few. These areas differ with regard to&lt;br&gt;the specific sorts of meta-models (or grammars, schemas, formats etc.)&lt;br&gt;that underlie the involved artifacts, and with regard to the specific&lt;br&gt;techniques that are employed for the generation and the transformation&lt;br&gt;of the artifacts.&amp;nbsp; The tutorials are given by renowned representatives&lt;br&gt;of complementary approaches and problem domains. Each tutorial&lt;br&gt;combines foundations, methods, examples, and tool support. The program&lt;br&gt;of the summer school also features invited technology presentations,&lt;br&gt;which present setups for generative and transformational&lt;br&gt;techniques. These presentations complement each other in terms of the&lt;br&gt;chosen application domains, case studies, and the underlying&lt;br&gt;concepts. The program of the school also features a participants&lt;br&gt;workshop. All summer school material will be collected in proceedings&lt;br&gt;that are handed out to the participants. Formal proceedings will be&lt;br&gt;compiled after the summer school, where all contributions are&lt;br&gt;subjected to additional reviewing.&lt;br&gt;&lt;br&gt;The formal proceedings of the previous two instances of the summer&lt;br&gt;school (2005 and 2007) were published as volumes 4143 and 5235 in the&lt;br&gt;Lecture Notes in Computer Science series of Springer-Verlag.&lt;br&gt;&lt;br&gt;&lt;br&gt;TUTORIALS&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * Software Product Line Refactoring&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Paulo Borba, Univ. Federal de Pernambuco, Recife, Brazil&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * The TXL Source Transformation Cookbook&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; James R. Cordy, Queen's University, Kingston, Canada&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * Chasing Diagrams in the Mapping Forests of Model Transformations&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Zinovy Diskin, Univ. of Waterloo and Univ. of Toronto, Canada&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * Generating Language Tools with JastAdd&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Görel Hedin, Lund Institute of Technology, Sweden.&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * Model Driven Language Engineering with Kermeta&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Jean-Marc Jézéquel, IRISA, Rennes, France&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * Rascal: Meta-programming Made Easy&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Paul Klint, CWI and Universiteit van Amsterdam, Netherlands&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * Sourcerer: Slicing and Dicing Large Amounts of Open Source Code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cristina Videira Lopes, University of California, Irvine, USA&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * The Theory and Practice of Modeling Language Design for&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Model-Based Engineering&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bran Selic, Malina Software Corp., Canada&lt;br&gt;&lt;br&gt;&lt;br&gt;RESEARCH 2.0 EVENT&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * Research 2.0 and Software Engineering 2.0&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Jean-Marie Favre and Denis Avrilionis&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OneTree Technologies SA, Luxembourg and&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; University of Grenoble, France&lt;br&gt;&lt;br&gt;&lt;br&gt;SHORT TUTORIALS&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * The 'Archæology' of Transformations&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Michel Wermelinger and Yijun Yu, The Open University. UK&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * Compilation for Embedded and Reconfigurable &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Computing Architectures&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; João M. P. Cardoso, University of Porto, Portugal&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * Lightweight Domain-Specific Language Processing in Kiama&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Anthony Sloane, Macquarie University, Australia&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * Genesys: Service-Oriented Construction of Property &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Conform Code Generators&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tiziana Margaria, University of Potsdam, Germany&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * The Need for Early Aspects&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ana Moreira, Universidade Nova de Lisboa, Portugal&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * Model Transformation Chains for &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Model-Driven Performance Engineering&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mathias Fritzsche, SAP Research&lt;br&gt;&lt;br&gt;&lt;br&gt;ORGANIZATION COMMITTEE&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; * João M. Fernandes (Program Co-Chair), Univ. do Minho, Portugal&lt;br&gt;&amp;nbsp;&amp;nbsp; * Ralf Lämmel (Program Co-Chair), Univ. Koblenz-Landau, Germany&lt;br&gt;&amp;nbsp;&amp;nbsp; * João Saraiva, Universidade do Minho, Portugal&lt;br&gt;&amp;nbsp;&amp;nbsp; * Joost Visser, Software Improvement Group, The Netherlands&lt;br&gt;&lt;br&gt;&lt;br&gt;ADDITIONAL INFORMATION&lt;br&gt;&lt;br&gt;For additional information on the registration, program, venue, and&lt;br&gt;other details of the summer school, please consult the web page:&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; http://gttse.wikidot.com/&lt;br&gt;&lt;br&gt;There is also a contact email address: &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; gttse09 AT list.uni MINUS koblenz.de.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9668793" width="1" height="1"&gt;</description></item><item><title>Approaching the API migration challenge</title><link>http://blogs.msdn.com/ralflammel/archive/2008/11/25/approaching-the-api-migration-challenge.aspx</link><pubDate>Tue, 25 Nov 2008 16:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9141815</guid><dc:creator>RalfLammel</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/9141815.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=9141815</wfw:commentRss><description>&lt;p&gt;I enjoyed delivering an invited lecture at the PhD &lt;a href="http://www.win.tue.nl/ipa/activities/falldays2008/index.html" mce_href="http://www.win.tue.nl/ipa/activities/falldays2008/index.html"&gt;autumn school IPA 2008&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Abstract&lt;/b&gt; &lt;br&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;For
about 4 years now I have been sporadically talking about API migration
as a scientific and technical challenge as well as a potential business
idea. It all started with some background in grammar engineering,
formal semantics, and re-engineering which made me see that APIs are
tricky software languages that account for a good part of the
intricacies in automated software evolution. I was fired up when I
acquired a handle on Microsoft's XML APIs during my recent work on the
XML team at Microsoft. At this point I gained confidence in the
business value and the eventual feasibility of API migration. While API
migration is arguably the top subject on my research agenda, I haven't
made substantial progress over the last few years. Meanwhile others
have made both expected and unexpected contributions to the subject,
which I would like to put into perspective. However, I contend that the
hard problem is still to be attacked. In this talk, I am going to
reexamine the landscape of API migration, and submit a mid-term
call-to-arms to cross the API migration's Rubicon. I will also report
on some experiments or experiences with API usage analysis, API
protocol specification, API-related flow analysis of programs, and
transformation technology for API migration. &lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;My slides are also online &lt;a href="http://www.uni-koblenz.de/%7Elaemmel/apimigration/" mce_href="http://www.uni-koblenz.de/~laemmel/apimigration/"&gt;here&lt;/a&gt;. I am happy enough to work with &lt;a href="http://homepages.cwi.nl/%7Estorm/" mce_href="http://homepages.cwi.nl/~storm/"&gt;Tijs van der Storm&lt;/a&gt;
(CWI, Amsterdam) on this very topic. Tijs is currently visiting
researcher at our department in Koblenz. We expect to release a paper
on the "API migration's Rubicon" soon. Please stay tuned. The slides
also show a few diagrams for Java API usage. We do such usage analysis
to better understand the realities of APIs. (Thanks are due here to two
students of mine: Ruwen Hahn and Jürgen Starek.) Again, we hope to
publish some results of this project very soon.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Regards,&lt;/p&gt;&lt;p&gt;Ralf&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9141815" width="1" height="1"&gt;</description></item><item><title>Java divergence</title><link>http://blogs.msdn.com/ralflammel/archive/2008/10/31/java-divergence.aspx</link><pubDate>Fri, 31 Oct 2008 07:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9025911</guid><dc:creator>RalfLammel</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/9025911.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=9025911</wfw:commentRss><description>&lt;p&gt;So &lt;a href="http://www.uni-koblenz.de/%7Elaemmel/jls/" mce_href="http://www.uni-koblenz.de/~laemmel/jls/"&gt;here&lt;/a&gt; is the long promised paper on the Java case study for &lt;a href="http://www.uni-koblenz.de/%7Elaemmel/convergence/" mce_href="http://www.uni-koblenz.de/~laemmel/convergence/"&gt;grammar convergence&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Getting all these huge Java grammars to converge was not easy. We are still learning how to do this properly. We are still working on our transformation language, but we feel the results are good enough to go public now. The magic thing about grammar convergence is that it pushes you to necessarily find all the details of grammar variation. Arguably, grammar convergence should be more automatic. However, by asking you to make the transformation decisions, it helps you to understand the result. &lt;br&gt;&lt;/p&gt;&lt;p&gt;From now on, suites of related grammars should have no excuse to be flawed and close-lipped as far as their relationships go.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Regards, &lt;br&gt;&lt;/p&gt;&lt;p&gt;Ralf&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;PS: Now that I repaired the link I can as well put the abstract here.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h1&gt;Java is Not Syntax-safe -- Apparently&lt;/h1&gt;&lt;dl&gt;&lt;dt&gt;&lt;b&gt;Authors&lt;/b&gt;
&lt;/dt&gt;&lt;dd&gt; Ralf Lämmel and Vadim Zaytsev
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;Abstract&lt;/b&gt;
&lt;/dt&gt;&lt;dd&gt;
  Using a mechanized process, we have reverse-engineered the
  relationships between the 6 different grammars that are contained in
  3 versions of the Java Language Specification (JLS). To this end, we
  have extracted the grammars from (the HTML representation of) the
  JLS, and we have systematically resolved or captured all accidental
  or intended differences by grammar transformations. The project
  reveals a considerable number of problems with the grammars such as
  productions that did not define the intended language.

&lt;/dd&gt;&lt;/dl&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9025911" width="1" height="1"&gt;</description></item><item><title>Grammar Convergence -- another method for Software Language Engineers</title><link>http://blogs.msdn.com/ralflammel/archive/2008/09/20/grammar-convergence-another-method-for-software-language-engineers.aspx</link><pubDate>Sat, 20 Sep 2008 03:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8959614</guid><dc:creator>RalfLammel</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/8959614.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=8959614</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;I have turned a bit too much into an org animal over the last year or so: several conference organizations, special issues in journals, way too many PC member ships (in fact, there are too many workshops that are like mini conferences). Add to this that the switch to a full(time) German Professor ruins all previous working habits. Now that I have seen the “dark side” (not speaking of any big corporation here), I even more admire those folks in academia who do loads of quality courses, and still do substantial research – perhaps even with getting their own hands dirty. Anyway, I guess, this is the reality shock that you can’t avoid when you switch from industrial research (or before that, academic research with a way lower teaching load) to the mode of a university teacher of the kind of a German Professor. Not sure why anyone would do this except for the “&lt;/FONT&gt;&lt;A href="http://www.dict.cc/german-english/Anstellung+auf+Lebenszeit.html"&gt;&lt;FONT face=Calibri size=3&gt;Anstellung auf Lebenszeit&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;”. (I can imagine a few more reasons but I save you my sarcasm.) &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;My colleagues keep telling me that things get better, and arguably, I might have arrived at the turning point. Of great help is here that Vadim Zaytsev (a PhD student of &lt;/FONT&gt;&lt;A href="http://www.cs.vu.nl/~x/"&gt;&lt;FONT face=Calibri size=3&gt;X&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; and me from Amsterdam; Vadim is getting closer to the finish line) has joined the software-languages team in Koblenz last spring. This is particularly exciting because he has profound background in grammarware engineering – a topic that I have been talking about a lot over the last few years without delivering any new stuff except perhaps for the various X/O/R papers. For the last 3 months, we have been working on some grammarware engineering activities. We have been hacking in the best sense of the word. &lt;B style="mso-bidi-font-weight: normal"&gt;Today, we are proud to reveal our work on “grammar convergence”.&lt;/B&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;I have just uploaded an &lt;/FONT&gt;&lt;A href="http://www.uni-koblenz.de/~laemmel/convergence/"&gt;&lt;FONT face=Calibri size=3&gt;intro paper on grammar convergence&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt; to my website, but expect some more stuff over the next few weeks and months. (This paper has just been submitted, and your feedback is welcome.) I quote from the conclusion of the paper: “&lt;I style="mso-bidi-font-style: normal"&gt;If unit testing is the simple, pragmatic, and effective method to generally validate the I/O behavior of software modules, then grammar convergence is the simple, pragmatic, and effective method to keep scattered grammar knowledge in sync. In addition, the method can be used to capture the intended or the accidental differences between instances of scattered grammar knowledge. Further, grammar convergence also applies at the instance level (populated by XML trees, derivation trees, parse trees, etc.). That is, it can compare and converge data from different software artifacts.”&lt;/I&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Final plug: Are you attending &lt;/FONT&gt;&lt;A href="http://planet-sl.org/"&gt;&lt;FONT face=Calibri size=3&gt;SLE 2008&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt; – the First International Conference on Software Language Engineering? It’s end of September in Toulouse (which is in France, for geographically challenged readers). The scientific quality of the event taken for granted, let me mention that I have heard of phenomenal cuisine aspects. &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;Please consider attending. This conference on Software Language Engineering unites some communities that previously had mainly workshops as their forum. Imagine this: we had 100+ abstract submissions for this &lt;I style="mso-bidi-font-style: normal"&gt;first&lt;/I&gt; iteration of the conference. Well, 90 sharp actually made the deadline in the end and submitted a proper paper. So we will have 18 papers over 2 days in the enjoyable surroundings of Toulouse and the MODELS conference with its various workshops – many of them also relevant for Software Language Engineers. Looking at the program, I see folks with background in refactoring, compiler construction, programming languages, declarative programming and executable specification, visual languages, modeling languages, formal methods, grammar-based programming, software transformation, software re- and reverse engineering, and model-driven development. &lt;B style="mso-bidi-font-weight: normal"&gt;Of course, I am biased, but this is a conference where I am sure that my broad interests are sufficient to appreciate each and every paper. The key is that all presentations assemble around the notion of software language engineering.&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Regards,&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Ralf&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8959614" width="1" height="1"&gt;</description></item><item><title>StrategoMetaTheory</title><link>http://blogs.msdn.com/ralflammel/archive/2008/09/19/strategometatheory.aspx</link><pubDate>Sat, 20 Sep 2008 01:58:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8959547</guid><dc:creator>RalfLammel</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/8959547.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=8959547</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Berenike, Bernadette, and Isabelle are all doing great. I tend to put photos of my kids online when they get born, and then never again, which I admit is strange; see &lt;/FONT&gt;&lt;A href="http://homepages.cwi.nl/~ralf/pltp/"&gt;&lt;FONT face=Calibri size=3&gt;here&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; and &lt;/FONT&gt;&lt;A href="http://homepages.cwi.nl/~ralf/isabelle/"&gt;&lt;FONT face=Calibri size=3&gt;here&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;. (There are only two links because B&amp;amp;B are twins.) I guess we have just so many photos of them that we don’t know which of them to put online. Also, Berenike and Bernadette are turning 9 next year, and they start to get embarrassed by their parents’ actions. Shooting and publishing photos may fail to see their approval. I missed the short window of doing so. Isabelle who turns 3 next year is a fast learner and great imitator; she is even less permissive than her big sisters. &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Speaking of Isabelle and “approval”, I have uploaded &lt;/FONT&gt;&lt;A href="http://www.uni-koblenz.de/~laemmel/isabelle2/"&gt;&lt;FONT face=Calibri size=3&gt;a new paper&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; (draft) to my website. It uses Isabelle/HOL to develop a sort of metatheory for traversal strategies. It is my first project on theorem proving. (I am sane enough not to count type-class-based programming in Haskell as theorem proving.) (Also, don’t get confused with the URL’s ending, “isabelle2”. There is really just one Isabelle/HOL paper so far. The URL helps me to avoid confusion with my youngest daughter’s photo directory, even though it is on a different host.) This is joint work with Markus Kaiser, a Mathematician, who has worked on theorem proving for some time (mostly in the context of cryptology) before he joined the SLE team in Koblenz. &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;This paper has just been submitted. Hence feedback, if any, is appreciated, and will be considered. The actual code distribution is still a bit of a mess, as of writing, but it will be fine, if the paper’s web site says so – soon, hopefully.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Regards,&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Ralf&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;Title:&lt;/B&gt; A Formal Model of Traversal Strategies&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;Authors:&lt;/B&gt; Markus Kaiser and Ralf Lämmel&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;URL:&lt;/B&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;A href="http://www.uni-koblenz.de/~laemmel/isabelle2/"&gt;&lt;FONT face=Calibri size=3&gt;http://www.uni-koblenz.de/~laemmel/&lt;B style="mso-bidi-font-weight: normal"&gt;isabelle2&lt;/B&gt;/&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;Abstract:&lt;/B&gt; There is an observable increase in interest in traversal expressiveness in programming: there are new rewriting languages, programming-language extensions, and combinator libraries that enable programmers to design and deploy traversals over structured data. Such traversal programs can go wrong in new ways. For instance, a traversal may suddenly fail or diverge. It is important to gain better understanding of properties of traversal programs so that programmers make more knowledgeable choices of traversal schemes, and programming environments may provide improved documentation, targeted checks, and other support. This paper presents a machine-checked, Isabelle/HOL-based, formal model of traversal strategies. Amongst others, the model provides sufficient conditions for traversal programs not to fail and not to diverge. The model with its mechanized proofs makes systematic use of Isabelle/HOL's various capabilities for dealing with recursion or induction.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8959547" width="1" height="1"&gt;</description></item><item><title>Mark the date: generative and transformational key event in 2009</title><link>http://blogs.msdn.com/ralflammel/archive/2008/08/26/mark-the-date-generative-and-transformational-key-event-in-2009.aspx</link><pubDate>Tue, 26 Aug 2008 22:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8898240</guid><dc:creator>RalfLammel</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/8898240.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=8898240</wfw:commentRss><description>&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;b&gt;Update: See the web site at &lt;a href="http://gttse.wikidot.com/" title="http://gttse.wikidot.com/" mce_href="http://gttse.wikidot.com/"&gt;http://gttse.wikidot.com/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;______________________________________________&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style=""&gt;&lt;i style=""&gt;What&lt;/i&gt;&lt;/b&gt;: 3rd Int’l Summer School on Generative and Transformational Techniques.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style=""&gt;&lt;i style=""&gt;Acronym&lt;/i&gt;&lt;/b&gt;: GTTSE 2009.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style=""&gt;&lt;i style=""&gt;When&lt;/i&gt;&lt;/b&gt;: &lt;b style=""&gt;&lt;span style="font-size: 12pt; color: red; line-height: 115%;"&gt;July 6 – 11, 2009&lt;/span&gt;&lt;/b&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style=""&gt;&lt;i style=""&gt;Where&lt;/i&gt;&lt;/b&gt;: Braga, Portugal.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style=""&gt;&lt;i style=""&gt;Speakers&lt;/i&gt;&lt;/b&gt;: to be revealed soon.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style=""&gt;&lt;i style=""&gt;Previous editions&lt;/i&gt;&lt;/b&gt;: &lt;/font&gt;&lt;/font&gt;&lt;a href="http://wiki.di.uminho.pt/twiki/bin/view/Events/GTTSE/" mce_href="http://wiki.di.uminho.pt/twiki/bin/view/Events/GTTSE/"&gt;&lt;font face="Calibri" size="3"&gt;GTTSE 2005&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;, &lt;/font&gt;&lt;a href="http://wiki.di.uminho.pt/twiki/bin/view/Events/GTTSE2007/WebHome" mce_href="http://wiki.di.uminho.pt/twiki/bin/view/Events/GTTSE2007/WebHome"&gt;&lt;font color="#800080" face="Calibri" size="3"&gt;GTTSE 2007&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style=""&gt;&lt;i style=""&gt;Size&lt;/i&gt;&lt;/b&gt;: 100 = 80 participants, 16 speakers, 4 organizers.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;b style=""&gt;&lt;i style=""&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;What’s new this time?&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b style=""&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Do you think anything was wrong? Say with …&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New';"&gt;&lt;span style=""&gt;o&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;... the level of sophistication?&lt;b style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New';"&gt;&lt;span style=""&gt;o&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;… the intensity of &lt;/font&gt;&lt;/span&gt;&lt;a href="http://www.flickr.com/photos/eelcovisser/757523526/" mce_href="http://www.flickr.com/photos/eelcovisser/757523526/"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font color="#800080" face="Calibri"&gt;learning experience&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;?&lt;b style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New';"&gt;&lt;span style=""&gt;o&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;… the sheer number of &lt;/font&gt;&lt;/span&gt;&lt;a href="http://www.flickr.com/photos/eelcovisser/760638896/" mce_href="http://www.flickr.com/photos/eelcovisser/760638896/"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font color="#800080" face="Calibri"&gt;nerds&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt; locked up together?&lt;b style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New';"&gt;&lt;span style=""&gt;o&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;… the &lt;/font&gt;&lt;/span&gt;&lt;a href="http://picasaweb.google.com/xiong.yingfei/200707EuropeGTTSEPortugal/photo#5086204702940254594" mce_href="http://picasaweb.google.com/xiong.yingfei/200707EuropeGTTSEPortugal/photo#5086204702940254594"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;beautiful surroundings&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;?&lt;b style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New';"&gt;&lt;span style=""&gt;o&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;… the exercises in the &lt;/font&gt;&lt;/span&gt;&lt;a href="http://picasaweb.google.com/xiong.yingfei/200707EuropeGTTSEPortugal/photo#5086201559024193682" mce_href="http://picasaweb.google.com/xiong.yingfei/200707EuropeGTTSEPortugal/photo#5086201559024193682"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;swimming pool&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;?&lt;b style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New';"&gt;&lt;span style=""&gt;o&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;… the all-inclusive &lt;/font&gt;&lt;/span&gt;&lt;a href="http://www.flickr.com/photos/fheidenreich/770635551/" mce_href="http://www.flickr.com/photos/fheidenreich/770635551/"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font color="#800080" face="Calibri"&gt;Portuguese dinners&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;?&lt;b style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New';"&gt;&lt;span style=""&gt;o&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;… the splendid &lt;/font&gt;&lt;/span&gt;&lt;a href="http://picasaweb.google.com/xiong.yingfei/200707EuropeGTTSEPortugal/photo#5086201589088964818" mce_href="http://picasaweb.google.com/xiong.yingfei/200707EuropeGTTSEPortugal/photo#5086201589088964818"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;social program&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;?&lt;b style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New';"&gt;&lt;span style=""&gt;o&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;… the &lt;/font&gt;&lt;/span&gt;&lt;a href="http://www.flycheapo.com/flights/oporto" mce_href="http://www.flycheapo.com/flights/oporto"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font color="#800080" face="Calibri"&gt;low price of travel&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt; and attendance?&lt;b style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 1in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: 'Courier New';"&gt;&lt;span style=""&gt;o&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;What else?&lt;b style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;We will be using a painless selection procedure this time.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;We want to definitely increase participation of women.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;We are working on adding 1 or 2 satellite events.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;There will be one sports event every day.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;We aim at stronger industrial presence.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;o:p&gt;&lt;font face="Calibri" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;b style=""&gt;&lt;i style=""&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;What could &lt;u&gt;you&lt;/u&gt; do now?&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="color: red; font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b style=""&gt;&lt;i style=""&gt;&lt;span style="color: red;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;Mark the date!&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style=""&gt;&lt;i style=""&gt;Spread the message&lt;/i&gt;&lt;/b&gt;; we want the best GTTSE talents to come.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;If you have an idea for a &lt;b style=""&gt;&lt;i style=""&gt;short tutorial&lt;/i&gt;&lt;/b&gt;, contact us ASAP.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;If you consider organizing a &lt;b style=""&gt;&lt;i style=""&gt;satellite event&lt;/i&gt;&lt;/b&gt;, contact us.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;If you have ideas for &lt;b style=""&gt;&lt;i style=""&gt;industrial coverage&lt;/i&gt;&lt;/b&gt;, again, contact us.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;We very much appreciate &lt;b style=""&gt;&lt;i style=""&gt;sponsors&lt;/i&gt;&lt;/b&gt; of course.&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;o:p&gt;&lt;font face="Calibri" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;b style=""&gt;&lt;i style=""&gt;Your summer school team for 2009&lt;/i&gt;&lt;/b&gt;:&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.di.uminho.pt/%7Ejmf/" mce_href="http://www.di.uminho.pt/~jmf/"&gt;&lt;font face="Calibri" size="3"&gt;João M. Fernandes&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;, Universidade do Minho, Braga, Portugal&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.uni-koblenz.de/%7Elaemmel/" mce_href="http://www.uni-koblenz.de/~laemmel/"&gt;&lt;font face="Calibri" size="3"&gt;Ralf Lämmel&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;, University of Koblenz-Landau, Germany&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.di.uminho.pt/%7Ejas/" mce_href="http://www.di.uminho.pt/~jas/"&gt;&lt;font face="Calibri" size="3"&gt;João Saraiva&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;, Universidade do Minho, Braga, Portugal&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span style=""&gt;&lt;font size="3"&gt;·&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font face="Calibri" size="3"&gt;Joost Visser, &lt;/font&gt;&lt;a href="http://www.sig.nl/" mce_href="http://www.sig.nl/"&gt;&lt;font face="Calibri" size="3"&gt;Software Improvement Group&lt;/font&gt;&lt;/a&gt;&lt;font face="Calibri" size="3"&gt;, Amsterdam, NL&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;o:p&gt;&lt;font face="Calibri" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;b style=""&gt;&lt;i style=""&gt;&lt;font size="3"&gt;&lt;font face="Calibri"&gt;&lt;u&gt;Short&lt;/u&gt; hall of fame (previous &lt;u&gt;full&lt;/u&gt; tutorials only):&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.cs.utexas.edu/users/dsb/" mce_href="http://www.cs.utexas.edu/users/dsb/" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Don Batory&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, The University of Texas at Austin, USA&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.semdesigns.com/" mce_href="http://www.semdesigns.com/" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Ira Baxter&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, Semantic Designs Inc., USA&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.sciences.univ-nantes.fr/lina/atl" mce_href="http://www.sciences.univ-nantes.fr/lina/atl" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Jean Bezivin&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, INRIA, LINA, University of Nantes, France&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.csg.is.titech.ac.jp/%7Echiba/" mce_href="http://www.csg.is.titech.ac.jp/~chiba/" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Shigeru Chiba&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, Tokyo Institute of Technology, Japan&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.swen.uwaterloo.ca/%7Ekczarnec/" mce_href="http://www.swen.uwaterloo.ca/~kczarnec/" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Krzysztof Czarnecki&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, University of Waterloo, Canada&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www-adele.imag.fr/users/Jean-Marie.Favre" mce_href="http://www-adele.imag.fr/users/Jean-Marie.Favre" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Jean-Marie Favre&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, University of Grenoble, France&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.info.fundp.ac.be/libd" mce_href="http://www.info.fundp.ac.be/libd" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Jean-Luc Hainaut&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, University of Namur, Belgium&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.ipl.t.u-tokyo.ac.jp/%7Ehu/" mce_href="http://www.ipl.t.u-tokyo.ac.jp/~hu/" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Zhenjiang Hu&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, University of Tokyo, Japan&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.comp.nus.edu.sg/%7Estan/" mce_href="http://www.comp.nus.edu.sg/~stan/" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Stan Jarzabek&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, National University of Singapore&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://research.microsoft.com/%7Eemeijer/" mce_href="http://research.microsoft.com/~emeijer/" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Erik Meijer&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, Microsoft, Redmond, USA&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://staff.umh.ac.be/Mens.Tom/" mce_href="http://staff.umh.ac.be/Mens.Tom/" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Tom Mens&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, University of Mons-Hainaut, Belgium&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://web.comlab.ox.ac.uk/oucl/people/oege.de.moor.html" mce_href="http://web.comlab.ox.ac.uk/oucl/people/oege.de.moor.html" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Oege de Moor&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, Oxford University, UK&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.di.uminho.pt/%7Ejno" mce_href="http://www.di.uminho.pt/~jno" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;José Nuno Oliveira&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, University of Minho, Portugal&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.ece.cmu.edu/%7Epueschel/" mce_href="http://www.ece.cmu.edu/~pueschel/" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Markus Pueschel&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, Carnegie Mellon University, USA&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.cs.rice.edu/%7Etaha/" mce_href="http://www.cs.rice.edu/~taha/" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Walid Taha&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, Rice University, USA&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast" style="margin: 0in 0in 10pt 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt; line-height: 115%; font-family: Symbol;"&gt;&lt;span style=""&gt;·&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.cs.uu.nl/%7Evisser" mce_href="http://www.cs.uu.nl/~visser" target="_blank"&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;Eelco Visser&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 10pt; line-height: 115%;"&gt;&lt;font face="Calibri"&gt;, Delft University of Technology, NL&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 10pt;"&gt;&lt;o:p&gt;&lt;font face="Calibri" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8898240" width="1" height="1"&gt;</description></item><item><title>The Expression Lemma – Explained</title><link>http://blogs.msdn.com/ralflammel/archive/2008/07/16/the-expression-lemma-explained.aspx</link><pubDate>Thu, 17 Jul 2008 00:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8740294</guid><dc:creator>RalfLammel</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/8740294.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=8740294</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;I have been somewhat silent for all kinds of boring reasons, but also quite so because I am terribly slow in grasping even basic category theory. (You don’t need to have any such knowledge to enjoy this post – just a bit of time because I guess this is going to be the longest blog post ever.) Still all the categorical pain was worth it, and here is why … The &lt;/FONT&gt;&lt;A href="http://www.uni-koblenz.de/~laemmel/expression/"&gt;&lt;FONT face=Calibri size=3&gt;Expression Lemma&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; captures a fundamental correspondence between Functional and OO Programming. In this blog post, let me try to explain the lemma in an easygoing manner. I will cut off all mentioning of the &lt;/FONT&gt;&lt;A href="http://homepages.inf.ed.ac.uk/wadler/papers/expression/expression.txt"&gt;&lt;FONT face=Calibri size=3&gt;Expression Problem&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; which constitutes arguably a motivation for this research. Let me focus on a very obvious and compelling motivation: &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;the lemma provides a foundation for refactoring OO programs of a certain scheme to functional programs of a certain, associated scheme&lt;/I&gt;&lt;/B&gt; (and vice versa; in case, the latter is really found useful and not considered a criminal offense). BTW, the &lt;I style="mso-bidi-font-style: normal"&gt;proof&lt;/I&gt; of the lemma will not be discussed below. Also, I should emphasize that only the &lt;I style="mso-bidi-font-style: normal"&gt;simple&lt;/I&gt; expression lemma will be covered here. So let me refer to the paper for all such elaborations. Before I get started I want to acknowledge that I report about joined work with &lt;/FONT&gt;&lt;A href="http://www.cs.nott.ac.uk/~oxr/"&gt;&lt;FONT face=Calibri size=3&gt;Ondrej Rypacek&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; who is currently presenting our results at the &lt;/FONT&gt;&lt;A href="http://mpc08.lri.fr/"&gt;&lt;FONT face=Calibri size=3&gt;Mathematics of Program Construction&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; conference in Marseille. In fact, Ondrej deserves most if not all credit. &lt;/FONT&gt;&lt;A href="http://sneezy.cs.nott.ac.uk/fplunch/weblog/?p=90"&gt;&lt;FONT face=Calibri size=3&gt;Ondrej also blogged about the lemma&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; some time back, and &lt;/FONT&gt;&lt;A href="http://lambda-the-ultimate.org/node/2709"&gt;&lt;FONT face=Calibri size=3&gt;LTU had linked to the post&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 20pt 0in 7pt"&gt;&lt;A class="" name=_Toc203978748&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Recursive operations on a recursive data structure&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Consider &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;a recursive data structure&lt;/I&gt;&lt;/B&gt;; let’s use &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;the abstract syntax of a tiny expression language&lt;/I&gt;&lt;/B&gt; in the running example. For simplicity, let’s limit ourselves to two expression forms: numeric literals, and binary expressions for addition. Consider some &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;recursive operations&lt;/I&gt;&lt;/B&gt; that are defined on the data structure. Let’s use “&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;expression evaluation&lt;/I&gt;&lt;/B&gt;” and some sort of “&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;expression transformation&lt;/I&gt;&lt;/B&gt;” in the running example. In Java, we can use an abstract class, &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;Expr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;, to model the data structure with abstract methods, &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;eval&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modn&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;, to model the operations. (We could also use interface polymorphism.)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;public abstract class Expr {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;public abstract int eval(); // Evaluate expressions&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;public abstract void modn(int n); // Transform modulo a constant &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;}&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; mso-bidi-font-size: 11.0pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;The &lt;I style="mso-bidi-font-style: normal"&gt;two&lt;/I&gt; expression forms give rise to &lt;I style="mso-bidi-font-style: normal"&gt;two&lt;/I&gt; subclasses that &lt;I style="mso-bidi-font-style: normal"&gt;encapsulate&lt;/I&gt; data and operations.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;public class Num extends Expr {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;private int value; // State&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;public Num(int value) { this.value = value; } // Constructor&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;public int eval() { return value; }&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;public void modn(int n) { this.value = this.value % n; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;public class Add extends Expr {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;private Expr left, right; // State&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;public Add(Expr left, Expr right) { // Constructor&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;this.left = left;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;this.right = right;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;public int eval() { return left.eval() + right.eval(); }&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;public void modn(int n) { left.modn(n); right.modn(n); }&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978749&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Contrasting styles of decomposition&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;The OO style of decomposition can be contrasted with the functional style (or the style of constructive, algebraic specification, if you prefer). The data variants are defined independently of any operation; operations are defined separately as functions that case-discriminate on the data variants. In Haskell:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;-- Expression forms&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;data Expr = Num Int | Add Expr Expr&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&lt;FONT size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;FONT size=3&gt;-- Evaluate expressions&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;FONT size=3&gt;eval :: Expr -&amp;gt; Int&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;FONT size=3&gt;eval (Num i) = i&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;FONT size=3&gt;eval (Add l r) = eval l + eval r&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;FONT size=3&gt;-- Transform all literals modulo a constant&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;FONT size=3&gt;modn :: Expr -&amp;gt; Int -&amp;gt; Expr&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;FONT size=3&gt;modn (Num i) n = Num (i `mod` n)&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;FONT size=3&gt;modn (Add l r) n = Add (modn l n) (modn r n)&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978750&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Semantic equivalence of OO and functional models&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Now the 1 Million $ question is this: Are the two shown programs semantically equivalent, and, if so, how could one possibly prove the equivalence? &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;The expression lemma will arise as an important tool in establishing that semantic equivalence.&lt;/I&gt;&lt;/B&gt; It is desirable to know of such equivalence because, for example, it would formally justify a refactoring from the OO style of decomposition to the functional one, and vice versa. Some might say that the semantic equivalence is reasonably obvious, but then again, how to formally establish this fact? Also, we are presumably looking for &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;a general class of equivalent program couples&lt;/I&gt;&lt;/B&gt; (rather than the specific exemplars at hand), but at this stage, it is not obvious how this class would be characterized.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;After 2-3 semesters of computer science, you may launch the following attempt.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Suppose:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l5 level1 lfo1"&gt;&lt;SPAN style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol"&gt;&lt;SPAN style="mso-list: Ignore"&gt;&lt;FONT size=3&gt;·&lt;/FONT&gt;&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;I style="mso-bidi-font-style: normal"&gt;j&lt;/I&gt; refers to the above Java program&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l5 level1 lfo1"&gt;&lt;SPAN style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol"&gt;&lt;SPAN style="mso-list: Ignore"&gt;&lt;FONT size=3&gt;·&lt;/FONT&gt;&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;I style="mso-bidi-font-style: normal"&gt;h&lt;/I&gt; refers to the above Haskell program&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l5 level1 lfo1"&gt;&lt;SPAN style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol"&gt;&lt;SPAN style="mso-list: Ignore"&gt;&lt;FONT size=3&gt;·&lt;/FONT&gt;&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT face=Calibri size=3&gt;[| . |]&lt;SUB&gt;Java&lt;/SUB&gt; assigns semantic meanings to (the relevant subset of) Java&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l5 level1 lfo1"&gt;&lt;SPAN style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol"&gt;&lt;SPAN style="mso-list: Ignore"&gt;&lt;FONT size=3&gt;·&lt;/FONT&gt;&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;[| . |]&lt;SUB&gt;Haskell&lt;/SUB&gt; assigns semantic meanings to (the relevant subset of) Haskell&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Then our educated but inexperienced CS student could hope to be able to show that:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;[| &lt;I style="mso-bidi-font-style: normal"&gt;j&lt;/I&gt; |]&lt;SUB&gt;Java&lt;/SUB&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Arial','sans-serif'"&gt;≡&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; [|&lt;I style="mso-bidi-font-style: normal"&gt;h&lt;/I&gt; |]&lt;SUB&gt;Haskell&lt;/SUB&gt;. &lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Or perhaps I just skipped too many classes and had too much wine over the years, and this could work. Anyway, I reckon that this approach would require “semantic voodoo” because the established semantic domains for the two abstraction mechanisms (i.e., classes vs. recursive functions on algebraic data types) are so radically different. In fact, the above equivalence claim does not make much sense, in its current form, because &lt;I style="mso-bidi-font-style: normal"&gt;the I/O behaviors do not even match at the type level&lt;/I&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978751&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Matching up the input type&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The functions of &lt;I style="mso-bidi-font-style: normal"&gt;h&lt;/I&gt; take term-like data via an argument, while the objects of &lt;I style="mso-bidi-font-style: normal"&gt;j&lt;/I&gt; readily &lt;I style="mso-bidi-font-style: normal"&gt;encapsulate&lt;/I&gt; data (state) on which to invoke methods. We can match up the input type by &lt;I style="mso-bidi-font-style: normal"&gt;building&lt;/I&gt; the objects of the OO program from the same representation that is fed into the functions. That is, expression objects would be constructed from expression terms. Let’s call this step &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;recursive object construction&lt;/I&gt;&lt;/B&gt;, and designate a static method &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;fromData&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; in the class &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;Expr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;. Now, if we assume that Java’s and Haskell’s integers can be compared, a “well-typed” proposition about the semantic equivalence of the &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;eval&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; method vs. the &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;eval&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; function can be stated as follows:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT face=Calibri size=3&gt;For all expression terms &lt;I style="mso-bidi-font-style: normal"&gt;t&lt;/I&gt;:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: 0.5in"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;Expr.fromData(&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;t&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;).eval()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt; &lt;/SPAN&gt;eval &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;t&lt;/FONT&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT face=Calibri size=3&gt;(Java goes left, Haskell goes right.)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;We cannot cover &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modn&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; in this manner, as will be clear shortly.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978752&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Matching up the output type by serialization&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;That is, the function &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modn&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; returns public data – expression terms, while the method &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modn&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; returns opaque data – expression objects. &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;So how can we possibly compare the results returned by the function and the method?&lt;/I&gt;&lt;/B&gt; An apparently symmetric choice would be to introduce the presumable “inverse” of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;fromData&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;; say an instance method &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;toData&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; which, in the case of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;Expr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;, extracts expression terms from expression objects. In fact, some of you may notice that such a couple &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;fromData&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;/&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;toData&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; would be possibly related to what’s called (de-) serialization in distributed programming or object persistency. So let’s try to match up the output type of methods and functions as follows: once a method has been performed such that a new object is returned (or an existing object is mutated), we would extract the state by serialization, hoping to use the data types of the functional program again for the representation of the externalized state, so that comparisons between functional and OO world make sense. If this all works, a “well-typed” proposition about the semantic equivalence of the &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modn&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; method vs. the &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modn&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; function could be stated as follows. (For simplicity of chaining, we assume that &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modn&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; returns the result of the transformation; hence, it is no longer a &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;void&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; method – something that is, btw, for deep reasons, even more evil for a Smalltalk programmer than a Haskell programmer.)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT face=Calibri size=3&gt;For all expression terms &lt;I style="mso-bidi-font-style: normal"&gt;t&lt;/I&gt;, for all &lt;I style="mso-bidi-font-style: normal"&gt;n&lt;/I&gt;:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: 0.5in"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;Expr.fromData(&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;t&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;).modn(&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;n&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;).toData() &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt; &lt;/SPAN&gt;modn &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;n&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;t&lt;/FONT&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT face=Calibri size=3&gt;(Again, Java goes left, Haskell goes right.)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Let’s scrutinize this use of de-/serialization. Here we note that serialization is “normally” meant to externalize an object’s state for the sake of being able to rematerialize (de-serialize) the object later or elsewhere. Not every object is serializable (in wild life). When an object ends up being serializable, then the serialization format is still effectively private to the corresponding object type, perhaps even to a specific implementation of the type – ask your local OO expert. Do we really want to &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;define semantic equivalence with reference to serialization (or reflection and RTTI), i.e., systematically look into the objects at hand, and patently break encapsulation?&lt;/I&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978753&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Matching up the output type by observation&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;I contend that semantic equivalence should instead be defined in reference to object interfaces and behavior (rather than “core dumps” extracted from the objects). So let’s try to limit the statement of equivalence to “observations” that are readily admitted by the OO interface. When these observations return “pure data”, e.g., integers, we can easily compare the results from the functional and OO world. For instance, the semantic equivalence of the &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modn&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; function vs. the &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modn&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; method could be approximated by using &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;eval&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; to perform observations. Thus: &lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;FONT face=Calibri size=3&gt;For all integers &lt;I style="mso-bidi-font-style: normal"&gt;n&lt;/I&gt;, for all expression terms &lt;I style="mso-bidi-font-style: normal"&gt;t&lt;/I&gt;:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: 0.5in"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;Expr.fromData(&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;t&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;).modn(&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;n&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;).eval() &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt; &lt;/SPAN&gt;(eval . modn &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;n&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;) &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;t&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT face=Calibri size=3&gt;(Again, Java goes left, Haskell goes right.)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;This option is in peace with encapsulation, and therefore is to be favored. However, the generality of the option is still to be established. In particular, &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;we need to find a way to universally quantify over all possible observations, and to compare the observations with the results from the functional world&lt;/I&gt;&lt;/B&gt;. To be continued.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&lt;FONT face=Calibri size=3&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978754&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Functional object encoding&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;At this point, we are still struggling with two different host languages in our equations (c.f.: “Java goes left, Haskell goes right”). A formal model is in closer reach if we first eliminated one language. It’s hard to be fair every day. Let’s say goodbye to the OO language; let’s encode OO programs functionally (aka non-dysfunctionally), i.e., by using a functional object encoding. Not much is changed though: the encoding preserves the decomposition style of the OO program, and the use of objects including encapsulation. We use Haskell to encode the encoding. There are the following steps:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l15 level1 lfo3"&gt;&lt;SPAN style="mso-bidi-font-family: Calibri"&gt;&lt;SPAN style="mso-list: Ignore"&gt;&lt;FONT face=Calibri size=3&gt;1.&lt;/FONT&gt;&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;I style="mso-bidi-font-style: normal"&gt;Declare an interface functor&lt;/I&gt;: this is a type constructor that defines the product of all method signatures for the interface of interest in terms of the state type of an object. The state type is abstracted as a type parameter; see &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;x&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; below. In the running example, the &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;eval&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; method returns an &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;Int&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;; the &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modn&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; methods takes an &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;Int&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and returns a transformed copy of “self” (aka “this”). Thus:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;type IExprF x = (Int, Int -&amp;gt; x)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l15 level1 lfo3"&gt;&lt;SPAN style="mso-bidi-font-family: Calibri"&gt;&lt;SPAN style="mso-list: Ignore"&gt;&lt;FONT face=Calibri size=3&gt;2.&lt;/FONT&gt;&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;I style="mso-bidi-font-style: normal"&gt;Declare the type of opaque objects&lt;/I&gt;: we take the &lt;I style="mso-bidi-font-style: normal"&gt;recursive closure&lt;/I&gt; of the interface functor. In this manner, the state type is effectively hidden from the observable interface. For convenience’s sake, we also define projections that allow us to invoke the different methods on a capsule. Thus:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;newtype &lt;B style="mso-bidi-font-weight: normal"&gt;IExpr&lt;/B&gt; = InIExpr { outIExpr :: IExprF &lt;B style="mso-bidi-font-weight: normal"&gt;IExpr&lt;/B&gt; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;callEval = fst . outIExpr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;callModn = snd . outIExpr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l15 level1 lfo3"&gt;&lt;SPAN style="mso-bidi-font-family: Calibri"&gt;&lt;SPAN style="mso-list: Ignore"&gt;&lt;FONT face=Calibri size=3&gt;3.&lt;/FONT&gt;&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;I style="mso-bidi-font-style: normal"&gt;Declare the type of interface implementations&lt;/I&gt;: This is just a trivial application of the interface functor. The idea is that an interface implementation observes the state and populates the type for the method signatures as prescribed by the interface functor. In the co-algebraic discipline of functional object encoding, the resulting type is called the co-algebra type for the functor at hand. Thus:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;type IExprCoAlg x = x -&amp;gt; IExprF x&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l15 level1 lfo3"&gt;&lt;SPAN style="mso-bidi-font-family: Calibri"&gt;&lt;SPAN style="mso-list: Ignore"&gt;&lt;FONT face=Calibri size=3&gt;4.&lt;/FONT&gt;&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;I style="mso-bidi-font-style: normal"&gt;Provide interface implementations&lt;/I&gt;: Remember, the Java blueprint contains one concrete class for numeric literals, and another concrete class for binary expressions for addition. In the former case, the state type is &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;Int&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;; in the latter case, the state type is a pair of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;IExpr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; objects. These are the corresponding interface implementations:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;numCoAlg :: IExprCoAlg Int&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;numCoAlg :: IExprCoAlg Int&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;numCoAlg = numEval /\ numModn&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;where&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;numEval = id&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;numModn = mod&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT face=Calibri size=3&gt;… or in non-&lt;/FONT&gt;&lt;A href="http://www.haskell.org/haskellwiki/Pointfree"&gt;&lt;FONT face=Calibri size=3&gt;pointfree&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; style:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;numCoAlg :: IExprCoAlg Int&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;numCoAlg i = (numEval, numModn)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;where&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;numEval = i&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;numModn n = i `mod` n&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;addCoAlg :: IExprCoAlg (IExpr, IExpr)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;addCoAlg = addEval /\ addModn&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;where&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;addEval = uncurry (+) . (callEval &amp;lt;*&amp;gt; callEval)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;addModn = uncurry (/\) . (callModn &amp;lt;*&amp;gt; callModn)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT face=Calibri size=3&gt;… or in non-&lt;/FONT&gt;&lt;A href="http://www.haskell.org/haskellwiki/Pointfree"&gt;&lt;FONT face=Calibri size=3&gt;pointfree&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; style:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;addCoAlg (l,r) =&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;(addEval, addModn)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;where&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;addEval = callEval l + callEval r&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;addModn n = (callModn l n, callModn r n)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l13 level1 lfo4"&gt;&lt;SPAN style="mso-bidi-font-family: Calibri"&gt;&lt;SPAN style="mso-list: Ignore"&gt;&lt;FONT face=Calibri size=3&gt;5.&lt;/FONT&gt;&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;I style="mso-bidi-font-style: normal"&gt;Provide object constructors&lt;/I&gt;: The Java blueprint had constructors. More generally, any class needs a protocol for populating object state. In a functional object encoding, a constructor can be modeled as a function that takes the initial state of an object, and encapsulates it with the method implementations. To this end, the &lt;/FONT&gt;&lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/Anamorphism"&gt;&lt;FONT face=Calibri color=#800080 size=3&gt;fundamental operation of unfolding&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; comes to rescue; unfold “builds” (or “constructs”) values of a functor’s recursive closure (here: IExpr) from values of some other type (here: integers or subobjects):&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;newNum&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt; :: Int -&amp;gt; IExpr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;newNum = unfoldIExpr numCoAlg&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;newAdd&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt; :: (IExpr, IExpr) -&amp;gt; IExpr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;newAdd = unfoldIExpr addCoAlg&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Conceptually, the unfold operation is defined generically for any functor: (i) apply the argument – a co-algebra (c.f. &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;c&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; below), (ii) map the unfold operation recursively over the positions of the functor’s type parameter (here: the occurrence of self’s type in the arguments and results of methods, c.f. &lt;/FONT&gt;&lt;SPAN style="LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 10.0pt"&gt;fmapIExprF&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; below), (iii) tie the recursive knot of the functor (c.f. &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;InIExpr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; below). Thus:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;unfoldIExpr&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt; :: IExprCoAlg x -&amp;gt; x -&amp;gt; IExpr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;unfoldIExpr c = InIExpr . fmapIExprF (unfoldIExpr c) . c&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The definition of the functorial map is induced by the structure of the functor at hand. The &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;IExprF&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; functor comprises one using occurrence of the type parameter in the second component of the pair, specifically in the result-type position of the function type (i.e., in the return-type of the signature of the &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modn&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; method). The argument of the functorial map is applied to that occurrence:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;fmapIExprF&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt; :: (x -&amp;gt; y) -&amp;gt; IExprF x -&amp;gt; IExprF y&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN lang=DE style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-ansi-language: DE"&gt;fmapIExprF f (e,m) = (e, f . m)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;This completes our transcription of the Java code to Haskell.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978755&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Reality check: computing 42 in different ways&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;As a simple illustration and clarification of the development so far, let us do some expression evaluation in different settings. In the OO setting, we construct objects by nested object construction on which we invoke the method for expression evaluation. Thus:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;public class Demo {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;public static void main(String[] args) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Expr x = new Add(&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;new Num(39),&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;new Add(&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;new Num(1),&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;new Num(2)));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;System.out.println(x.eval());&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Likewise, in the setting of the original functional program, we construct a nested term to which we apply the function for expression evaluation. While visually similar, it is important to notice that term construction results in plain, public data whereas object construction results in objects that encapsulate private data and behavior.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;main = do&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;let x = Add (Num 39) (Add (Num 1) (Num 2))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;print $ eval x&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Here is also a demo for the functionally encoded OO program:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;main = do&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;let x = newAdd (newNum 39, newAdd (newNum 1, newNum 2))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;print $ callEval x&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;All programs agree on the result of evaluation: 42.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978756&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Gory details of recursive object construction&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;We are now in the position to actually define &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;fromData&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; – as needed for matching up the input type of the two programs. Thanks to the functional object encoding it is now easier to see that it really makes sense to construct expression objects from expression trees. We exploit the fact that &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;the recursive data structure of the functional program coincides with the recursive closure of the union of the OO state types&lt;/I&gt;&lt;/B&gt;. Here is the type of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;fromData&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;fromData :: Expr -&amp;gt; IExpr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Our development relies on “&lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/Bird-Meertens_Formalism"&gt;&lt;FONT face=Calibri size=3&gt;Squiggol power&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;” and the entire backlog of functorially parameterized morphisms. Hence, we must redefine the recursive data structure as the recursive closure of its non-recursive functorial shape. (Compare this with the non-recursive interface functor and the separate definition of its recursive closure.) Thus:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;type ExprF x = Either Int (x,x)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;newtype &lt;B style="mso-bidi-font-weight: normal"&gt;Expr&lt;/B&gt; = InExpr { outExpr :: ExprF &lt;B style="mso-bidi-font-weight: normal"&gt;Expr&lt;/B&gt; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;num = InExpr . Left -- serves as constructor&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;add = InExpr . Right -- serves as constructor&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The type constructor &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;ExprF&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; captures the functorial shape of the expression forms. That is, it is a sum over &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;Int&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; (corresponding to the case of numeric literals) and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;(x,x)&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; (corresponding to the case of binary addition) where &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;x&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; is ultimately to be instantiated to the recursive closure of the functor. That closure is taken by &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;Expr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;. Indeed, the newly defined &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;Expr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; is isomorphic to the algebraic data type &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;Expr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; – as it was defined earlier. We can now combine the constructors for the two kinds of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;IExpr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; objects into a single function that dispatches on the functorial structure; here we apply &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;ExprF&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; to the opaque object type:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;newEither :: ExprF IExpr -&amp;gt; IExpr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;newEither = newNum \/ newAdd&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;… or more verbosely, by expansion of “&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;\/&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;”:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;newEither :: ExprF IExpr -&amp;gt; IExpr &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;newEither (Left i) = newNum i&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;newEither (Right lr) = newAdd lr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;It remains to apply &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;newEither&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; in a recursive manner.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The fundamental operation of folding comes to rescue. A fold traverses over a recursive data structure while it is parameterized by a fold algebra, i.e., operations to apply to intermediate results as well as leafs. The “one-layer” constructor &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;newEither&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; serves as the fold algebra in our case. In different words, recursive object construction is defined as a fold over expression terms while the constructor &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;newEither&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; dispatches on expression forms and invokes data variant-specific constructors at each level:&lt;BR style="mso-special-character: line-break"&gt;&lt;BR style="mso-special-character: line-break"&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;fromData :: Expr -&amp;gt; IExpr &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;fromData = foldExpr newEither&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoListParagraph style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Conceptually, the fold operation is defined generically for any functor: (i) reveal one layer of functorial shape from the recursive closure (c.f. &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;outExpr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; below); (ii) map the fold operation recursively over the positions of the functor’s type parameter (here: over the positions for subobjects, c.f. &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;fmapExprF&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; below), (iii) combine intermediate results (or process leafs) by applying the fold algebra (c.f. &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;a&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; below). Thus:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;type ExprAlg x = ExprF x -&amp;gt; x&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;foldExpr&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt; :: ExprAlg x -&amp;gt; Expr -&amp;gt; x&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;foldExpr a = a . fmapExprF (foldExpr a) . outExpr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;FONT face=Calibri size=3&gt;The functor implies the following functorial map:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;fmapExprF&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt; :: (x -&amp;gt; y) -&amp;gt; ExprF x -&amp;gt; ExprF y&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;fmapExprF f (Left i) = Left i&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;fmapExprF f (Right (x,x')) = Right (f x, f x')&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978757&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Arriving at behavioral equivalence&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;We are still in need of a general method for comparing the results returned by the functions vs. the methods. We already alluded to the use of observations for that purpose. There is one trick we did not yet mention. That is, &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;we can we construct objects (an ADT) from the functional program such that the functional program’s “public” data is encapsulated with the functions to be applied to that data. As a result, we will have objects on both sides of the equation, and hence, can perform observations on both sides, which makes it easier to set up a comparison.&lt;/I&gt;&lt;/B&gt; The ADT is constructed as follows:&lt;BR style="mso-special-character: line-break"&gt;&lt;BR style="mso-special-character: line-break"&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;newBoth :: Expr -&amp;gt; IExpr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;newBoth = unfoldIExpr both&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;both :: IExprCoAlg Expr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;both = eval /\ modn&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN lang=DE style="mso-ansi-language: DE"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;… or more verbosely, by expansion of “&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;/\&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;”:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&lt;FONT size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;both :: IExprCoAlg Expr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;both e = (eval e, modn e)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 14pt; LINE-HEIGHT: 115%; mso-bidi-font-size: 11.0pt"&gt;It’s time for a bold claim:&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;fromData&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;FONT size=3&gt; = newBoth&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;That is, &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;the objects obtained by recursive construction are equivalent to the objects obtained by the ADT construction.&lt;/I&gt;&lt;/B&gt; Let’s clarify the kind of equivalence at hand. Here we note that the terms on both sides of the equation are &lt;I style="mso-bidi-font-style: normal"&gt;functions&lt;/I&gt;, and the equality sign is meant here as &lt;I style="mso-bidi-font-style: normal"&gt;extensional equality&lt;/I&gt;, i.e., these functions always return the same result when applied to the same argument. Now, we also need to understand that &lt;I style="mso-bidi-font-style: normal"&gt;the functions return objects&lt;/I&gt; which are in turn tuples of functions (methods). Further, each such method can be invoked again to return new objects (i.e., yet other tuples of functions). That is, method invocation can be arranged in arbitrarily long chains. Extensional equality of &lt;/FONT&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;fromData&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;newBoth&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; implies that all these possible chains also lead to observationally equivalent results. &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;To summarize, the objects constructed by &lt;/I&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;fromData&lt;/SPAN&gt;&lt;FONT face=Calibri size=3&gt; and &lt;/FONT&gt;&lt;/I&gt;&lt;/B&gt;&lt;FONT size=3&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;newBoth&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;are indistinguishable by the observations (including chains of any length) admitted by the interface. This is really as much as we could hope for within the bounds of encapsulation.&lt;/FONT&gt;&lt;/I&gt;&lt;/B&gt;&lt;FONT face=Calibri&gt;&lt;I style="mso-bidi-font-style: normal"&gt; Hence, from here on, we replace the vague term of semantic equivalence by the more rigorous term of &lt;B style="mso-bidi-font-weight: normal"&gt;observational equivalence&lt;/B&gt;&lt;/I&gt;. &lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978758&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Making explicit more structure&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;We are not yet ready for a proof of the above claim. Intuitively, we need to get to a point where we can show that the functional program and the OO program are based on the same problem-specific ingredients (having to do with data variants for expressions and operations thereupon) which are only composed in different manners. At this point, the functional program is particularly monolithic: two functions written in the style of general recursion. Contrast this status with the functional object encoding of the OO program, where the co-algebra identifies all problem-specific ingredients in a structured manner. It is easy enough to achieve a similar degree of modularity for the &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;eval&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modn&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; functions by defining them in terms of fold; it is “well-known” that these forms can actually be derived automatically:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;eval :: Expr -&amp;gt; Int&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;eval = foldExpr evalAlg&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;evalAlg = evalNum \/ evalAdd&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;where&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;evalNum :: Int -&amp;gt; Int&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;evalNum = id&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;evalAdd :: (Int, Int) -&amp;gt; Int&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;evalAdd = uncurry (+)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;modn :: Expr -&amp;gt; Int -&amp;gt; Expr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;modn = foldExpr modnAlg&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;modnAlg = modnNum \/ modnAdd&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;where&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;modnNum :: Int -&amp;gt; Int -&amp;gt; Expr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;modnNum = ((.) num . mod)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;modnAdd :: (Int -&amp;gt; Expr, Int -&amp;gt; Expr) -&amp;gt; Int -&amp;gt; Expr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;modnAdd = ((.) add . uncurry (/\))&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978759&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Getting a sense for duality&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The ingredients &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;evalNum&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;, &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;evalAdd&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;, &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modnNum&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;modnNum&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; are really like the equations in the style of general recursion except that recursive components of the left-hand side are already replaced by the recursively computed results, and hence, the ingredients do not involve any recursive function applications of their own. (This is just a trivial and general consequence of committing to bananas.) The OO program is broken down into problem-specific ingredients quite similarly. Let’s compare. The functional program is structured as follows:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;newBoth&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;u&lt;SUB&gt;I&lt;/SUB&gt; both&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;u&lt;SUB&gt;I&lt;/SUB&gt; (eval /\ modn)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;u&lt;SUB&gt;I&lt;/SUB&gt; (f&lt;SUB&gt;E&lt;/SUB&gt; (evalNum \/ evalAdd) /\ f&lt;SUB&gt;E&lt;/SUB&gt; (modnNum \/ modnAdd))&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Here, we abbreviate as follows:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in" type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l7 level1 lfo5"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;f&lt;SUB&gt;E&lt;/SUB&gt; = foldExpr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l7 level1 lfo5"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;u&lt;SUB&gt;I&lt;/SUB&gt; = unfoldIExpr&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%"&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;The OO program is structured as follows:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;fromData &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;f&lt;SUB&gt;E&lt;/SUB&gt; newEither&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;f&lt;SUB&gt;E&lt;/SUB&gt; (newNum \/ newAdd)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;f&lt;SUB&gt;E&lt;/SUB&gt; (u&lt;SUB&gt;I&lt;/SUB&gt; (numEval /\ numModn) \/ u&lt;SUB&gt;I&lt;/SUB&gt; (addEval /\ addModn))&lt;/B&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;In both cases, recursion is under the regime of the composition scheme. &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;You don’t have to be a rocket scientist in category theory to smell the duality here.&lt;/I&gt;&lt;/B&gt; Subject to several conditions on the problem-specific ingredients, we may be able, eventually, to prove that both compositions are observationally equivalent.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978760&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Matching up problem-specific ingredients&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Get a coffee first; this is going to be the hard part of the post.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Playing stupid, one could hope that:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;evalNum = numEval&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;evalAdd = addEval&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;modnNum = numModn&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;modnAdd = addModn&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Quite obviously, this is not the case. (Not even the types fit.) A more complex correspondence has to be established. Let us do some factoring. To this end, we observe again that the functional style of decomposition results in as many “disjunctions” as there are operations; each such disjunction is processed by a fold; these folds are then combined in a conjunction. Dually, the OO style of decomposition results in as many “conjunctions” as there are data variants; each such conjunction is processed by an unfold; these unfolds are then combined in a disjunction. Let us factor out the inner uses of fold and unfold so that the problem-specific ingredients are solely composed by “/\” and “\/”.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;For any functor &lt;I style="mso-bidi-font-style: normal"&gt;F&lt;/I&gt;, the following “well-known” laws allow us to replace conjunctions of folds and disjunctions of unfolds by a single (co-) recursion:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The tupling law:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;f&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SUB&gt;&lt;FONT face=Calibri&gt;F&lt;/FONT&gt;&lt;/SUB&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;a&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; /\ f&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SUB&gt;&lt;FONT face=Calibri&gt;F&lt;/FONT&gt;&lt;/SUB&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;b&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; = f&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SUB&gt;&lt;FONT face=Calibri&gt;F&lt;/FONT&gt;&lt;/SUB&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; ((&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;a&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; . &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;F&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; fst) /\ (&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;b&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; . &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;F&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; snd))&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The co-tupling law:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;u&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SUB&gt;&lt;FONT face=Calibri&gt;F&lt;/FONT&gt;&lt;/SUB&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;a&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; \/ u&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SUB&gt;&lt;FONT face=Calibri&gt;F&lt;/FONT&gt;&lt;/SUB&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;b&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; = u&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SUB&gt;&lt;FONT face=Calibri&gt;F&lt;/FONT&gt;&lt;/SUB&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; ((&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;F&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; Left . &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;a&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;) \/ (&lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;F&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt; Right . &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;b&lt;/FONT&gt;&lt;/I&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;))&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;(For the sake of a dense notation, we use a functor in an expression position to refer to the functorial map for that functor.) The tupling law happens to be the foundation of a powerful, optimizing transformation: if we wish to pair the results of two folds applied to the same argument (based on a split, c.f., “/\”), we can combine their fold algebras in one, and thereby do the work of both folds in one pass of recursion. That is, rather than pairing the final results of two folds, we perform pairing (and projection) at each level of recursion, and thereby suffice with one traversal. We do not care for optimization here, only for factoring. The co-tupling law is the dual of the first one. In OO terms, it tells us how to use a single interface implementation as a surrogate for two implementations of the same interface while taking the union of the state types. Regardless of any intuitions, the laws allow us to factor the functional vs. OO style of decomposition as follows:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Functional:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;u&lt;SUB&gt;I&lt;/SUB&gt; (f&lt;SUB&gt;E&lt;/SUB&gt; fp)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;where&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN lang=DE style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-ansi-language: DE"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;fp&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;((evalNum \/ evalAdd) . E fst)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;/\&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;((modnNum \/ modnAdd) . E snd)))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;OO:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;f&lt;SUB&gt;E&lt;/SUB&gt; (u&lt;SUB&gt;I&lt;/SUB&gt; oop)&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;where&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;oop&lt;SPAN style="mso-tab-count: 1"&gt; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;(I Left . (numEval /\ numModn))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;\/&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;(I Right . (addEval /\ addModn))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Let’s distribute projections and injections so that we get conjunctions of disjunctions, or vice versa. Thus:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;fp&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;(evalNum \/ (evalAdd . (fst &amp;lt;*&amp;gt; fst)))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;/\&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;(modnNum \/ (modnAdd . (snd &amp;lt;*&amp;gt; snd)))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;oop&lt;SPAN style="mso-tab-count: 1"&gt; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;(numEval /\ ((.) Left . numModn))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;\/&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;(addEval /\ ((.) Right . addModn))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The roles of “\/” and “/\” are flipped in &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;fp&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;oop&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;. The “well-known” abide law can be used:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;FONT face=Calibri size=3&gt;(f /\ g) \/ (h /\ i) = (f \/ h) /\ (g \/ i)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Let’s apply the abide law to &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;oop&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;oop&lt;SPAN style="mso-tab-count: 1"&gt; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;(numEval \/ addEval)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;/\&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;(((.) Left . numModn) \/ ((.) Right . addModn))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Now let’s match up the operands of “\/” in &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;fp&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;oop&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;We highlight the differences in bold face.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1.5pt solid; mso-element: para-border-div"&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-bottom-alt: solid windowtext 1.5pt; mso-padding-alt: 0in 0in 1.0pt 0in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;evalNum&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;id &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;vs.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;numEval&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;id &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1.5pt solid; mso-element: para-border-div"&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-bottom-alt: solid windowtext 1.5pt; mso-padding-alt: 0in 0in 1.0pt 0in"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;evalAdd . (fst &amp;lt;*&amp;gt; fst) &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;= &lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp; &lt;/SPAN&gt;uncurry (+) . (fst &amp;lt;*&amp;gt; fst) &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;vs.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;addEval&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;uncurry (+) . ((fst . &lt;B style="mso-bidi-font-weight: normal"&gt;outIExpr&lt;/B&gt;) &amp;lt;*&amp;gt; (fst . &lt;B style="mso-bidi-font-weight: normal"&gt;outIExpr&lt;/B&gt;))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1.5pt solid; mso-element: para-border-div"&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-add-space: auto; mso-border-bottom-alt: solid windowtext 1.5pt; mso-padding-alt: 0in 0in 1.0pt 0in"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;modnNum &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;= &lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp; &lt;/SPAN&gt;(.) (&lt;B style="mso-bidi-font-weight: normal"&gt;InExpr&lt;/B&gt; . Left) . mod&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;vs.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;(.) Left . numModn&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;(.) Left . mod&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1.5pt solid; mso-element: para-border-div"&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-add-space: auto; mso-border-bottom-alt: solid windowtext 1.5pt; mso-padding-alt: 0in 0in 1.0pt 0in"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;modnAdd . (snd &amp;lt;*&amp;gt; snd)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;= &lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp; &lt;/SPAN&gt;(.) (&lt;B style="mso-bidi-font-weight: normal"&gt;InExpr&lt;/B&gt; . Right) . uncurry (/\) . (snd &amp;lt;*&amp;gt; snd) &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;vs.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;(.) Right . addModn&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;=&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;(.) Right . uncurry (/\) . ((snd . &lt;B style="mso-bidi-font-weight: normal"&gt;outIExpr&lt;/B&gt;) &amp;lt;*&amp;gt; (snd . &lt;B style="mso-bidi-font-weight: normal"&gt;outIExpr&lt;/B&gt;))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1.5pt solid; mso-element: para-border-div"&gt;
&lt;P class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BORDER-TOP: medium none; PADDING-LEFT: 0in; PADDING-BOTTOM: 0in; MARGIN: 0in 0in 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0in; BORDER-BOTTOM: medium none; mso-border-bottom-alt: solid windowtext 1.5pt; mso-padding-alt: 0in 0in 1.0pt 0in"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The differences can be understood as follows. The functional program has an extra step of committing results to the recursive closure of the data functor; c.f. &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;InExpr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;. The OO program has an extra step of retrieving arguments from the recursive closure of the interface functor; c.f. &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;outIExpr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;. These are really just “leftovers” from the particular decomposition styles. A “common denominator” of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;fp&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;oop&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; (referred to as &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; from here on) can be obtained by factoring out (left or right) the extra steps:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;oop :: IExprCoAlg (ExprF IExpr)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;oop = &lt;B style="mso-bidi-font-weight: normal"&gt;lambda&lt;/B&gt; . fmapExprF outIExpr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;fp :: ExprAlg (IExprF Expr)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;fp = fmapIExprF InExpr . &lt;B style="mso-bidi-font-weight: normal"&gt;lambda&lt;/B&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;lambda = ( a \/ b ) /\ ( c \/ d )&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Where&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;a = id&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;b = uncurry (+) . (fst &amp;lt;*&amp;gt; fst)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;c = (.) Left . mod&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;d = (.) Right . uncurry (/\) . (snd &amp;lt;*&amp;gt; snd)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;STRONG&gt;Here is the executive summary of the steps:&lt;o:p&gt;&lt;/o:p&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in" type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-list: l0 level1 lfo2"&gt;(1.a) Apply the tupling law to the separate folds of the functional program.&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-list: l0 level1 lfo2"&gt;(1.b) Apply the co-tupling law to the separate unfolds of the OO program.&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-list: l0 level1 lfo2"&gt;(2.a) Distribute projections into the disjunctions of the functional program.&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-list: l0 level1 lfo2"&gt;(2.b) Distribute injections into the conjunctions of the OO program.&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-list: l0 level1 lfo2"&gt;(3.) Apply the abide law to one of the intermediate results (say, to the OO program).&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-list: l0 level1 lfo2"&gt;(4.) Factor the programs to appeal to the following shapes:&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.25in; LINE-HEIGHT: normal"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;oop = &lt;STRONG&gt;lambda1&lt;/STRONG&gt; . fmapExprF outIExpr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;fp = fmapIExprF InExpr . &lt;STRONG&gt;lambda2&lt;o:p&gt;&lt;/o:p&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in; LINE-HEIGHT: normal"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in" type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-list: l0 level1 lfo2"&gt;(5.) Show (perhaps just “notice”) that &lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda1&lt;/SPAN&gt; and &lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda2&lt;/SPAN&gt; are equivalent.&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Step (5.) may fail for one of two reasons:&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in" type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo1"&gt;We are not clever enough.&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo1"&gt;The lambdas are different.&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978761&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;The type of the common denominator&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;What would be the type of &lt;/FONT&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;lambda&lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;? As a Haskell programmer, you get used to all kinds of advanced cheating – one is type inference. However, let’s fight like real men, and figure out the type ourselves because this might actually help with understanding the magic at hand. We start from the types of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;oop&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;fp&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;oop&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;:: IExprCoAlg (ExprF IExpr)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;fp&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:: ExprAlg (IExprF Expr)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Let’s expand the type synonyms for (co-) algebras:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;oop&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;:: ExprF IExpr -&amp;gt; IExprF (ExprF IExpr)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;fp&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;:: ExprF (IExprF Expr) -&amp;gt; IExprF Expr&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Let’s do step (4.) at the type level:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;lambda1 :: ExprF (IExprF &lt;B style="mso-bidi-font-weight: normal"&gt;IExpr&lt;/B&gt;) -&amp;gt; IExprF (ExprF &lt;B style="mso-bidi-font-weight: normal"&gt;IExpr&lt;/B&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;lambda2 :: ExprF (IExprF &lt;B style="mso-bidi-font-weight: normal"&gt;Expr&lt;/B&gt;) -&amp;gt; IExprF (ExprF &lt;B style="mso-bidi-font-weight: normal"&gt;Expr&lt;/B&gt;)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;This does not leave much space for a type of the common denominator:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;lambda :: ExprF (IExprF x) -&amp;gt; IExprF (ExprF x)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The two disagreeing positions of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda1&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda2&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;’s types (highlighted by bold face above) were generalized to the same type variable &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;x&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;. The type of any actual &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; must be at least as polymorphic as shown. We note that &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;‘s type is strictly more polymorphic than the explicit type signatures that we calculated for &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda1&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda2&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;. &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;If the factored definitions &lt;/I&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda1 &lt;/SPAN&gt;&lt;FONT face=Calibri&gt;and &lt;/FONT&gt;&lt;/I&gt;&lt;/B&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda2 &lt;/SPAN&gt;&lt;FONT face=Calibri&gt;(obtained by steps (1.)-(4.)) fail to type-check against the more polymorphic type, then our method fails to find observational equivalence.&lt;/FONT&gt;&lt;/I&gt;&lt;/B&gt;&lt;FONT face=Calibri&gt; In categorical terms, the required polymorphism is what &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; makes a &lt;/FONT&gt;&lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/Natural_transformations"&gt;&lt;FONT face=Calibri size=3&gt;natural transformation&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;, which is essentially a mapping from one functor to another. In fact, &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; is a special kind of natural transformation, i.e., a distributive law. That is, functors of source and target are actually compositions of two functors, and the composition is carried out in flipped order when comparing source and target; c.f.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;ExprF . IExprF&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt; &lt;/SPAN&gt;&lt;FONT face=Calibri size=3&gt;vs.&lt;/FONT&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt; &lt;/SPAN&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;IExprF . ExprF&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978762&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Unnatural or non-dualizable programs&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;It’s pretty easy to end up outside the required polymorphism. There is actually a systematic way of discussing such causes of unnaturality. We simply look at the computed types of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda1&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda2&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and discuss all the differences one by one:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=1&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l18 level1 lfo18"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;(Compare the argument position of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda1&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The OO program is not allowed to &lt;I style="mso-bidi-font-style: normal"&gt;invoke method chains on the subobjects&lt;/I&gt;. The result of invoking a subobject (by a single method call) cannot be further observed. (This follows from the fact that the general type &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;IExpr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; in &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;oop&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; (which is isomorphic to &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;IExprF IExpr&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; in &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda1&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;) is restricted to &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;IExprF x&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; in &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.) This limitation may come over as odd, and a generalized expression lemma is appreciated; see our lovely paper.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=1 start=2&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l18 level1 lfo18"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;(Compare the result position of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda1&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT face=Calibri size=3&gt;The OO program is not allowed to arbitrarily &lt;I style="mso-bidi-font-style: normal"&gt;construct and replace subobjects&lt;/I&gt;. A method implementation is bound (by the type) to use the objects returned by the observations of the subobjects to fill in the slots for the subobjects in the result. This is arguably not a bad limitation as it rules out OO programs that sort of arbitrarily rewrite the object graph. That is, the methods are enforced to be compositional in a certain way.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=1 start=3&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l18 level1 lfo18"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;(Compare the argument position of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda2&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The functional program is not allowed to &lt;I style="mso-bidi-font-style: normal"&gt;examine the precise expression structure&lt;/I&gt; of the intermediate results obtained by recursion. The less polymorphic type of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda2&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; exposes the precise expression structure; the extra polymorphism of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; hides the expression structure. Imposing such a ban on functional programmers resembles the notion of opaque data on the OO side, where one is not allowed to examine state (except when backdoors lack reflection and serialization are leveraged).&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=1 start=4&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l18 level1 lfo18"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;(Compare the result position of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda2&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;.)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.5in"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The functional program is not allowed to construct &lt;I style="mso-bidi-font-style: normal"&gt;deep terms&lt;/I&gt; while combining intermediate results obtained by recursion. The type of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; only admits one layer of functorial shape in the result; it does not even allow leaving out that single layer of functorial shape. This limitation may come over as odd, and a generalized expression lemma is appreciated; again, see our lovely paper.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978763&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;The Expression Lemma, finally&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;If we are able to match up the ingredients of a functional program and an OO program using the above steps (1.)-(5.), then the Expression Lemma promises observational equivalence for the different styles of composing the ingredients&lt;/I&gt;&lt;/B&gt;. The following version of the lemma glances over some technical details; please look at the paper, if you need to know more, and want to scrutinize the lemma or its proof. Given are two functors, &lt;I style="mso-bidi-font-style: normal"&gt;T&lt;/I&gt; and &lt;I style="mso-bidi-font-style: normal"&gt;I&lt;/I&gt;, think of &lt;I style="mso-bidi-font-style: normal"&gt;T&lt;/I&gt; as the data functor (like &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;ExprF&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; in the example), think of &lt;I style="mso-bidi-font-style: normal"&gt;I&lt;/I&gt; as the interface functor (like &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;IExprF&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; in the example). We assume generic definitions of fold and unfold for any functor. For clarity, we continue to attach the functor in question to any use of fold and unfold. Let’s stop using problem-specific recursive data types, and use the following generic type constructor for taking the recursive closure of any functor:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in"&gt;&lt;SPAN lang=DE style="FONT-FAMILY: 'Lucida Console'; mso-ansi-language: DE"&gt;&lt;FONT size=3&gt;newtype Mu f = In { out :: f (Mu f) }&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Then, for any &lt;I style="mso-bidi-font-style: normal"&gt;lambda&lt;/I&gt; :: &lt;I style="mso-bidi-font-style: normal"&gt;T&lt;/I&gt; (&lt;I style="mso-bidi-font-style: normal"&gt;I&lt;/I&gt; &lt;I style="mso-bidi-font-style: normal"&gt;x&lt;/I&gt;) -&amp;gt; &lt;I style="mso-bidi-font-style: normal"&gt;I&lt;/I&gt; (&lt;I style="mso-bidi-font-style: normal"&gt;T&lt;/I&gt; &lt;I style="mso-bidi-font-style: normal"&gt;x&lt;/I&gt;), the following identity holds:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;I style="mso-bidi-font-style: normal"&gt;unfold&lt;SUB&gt;I&lt;/SUB&gt;&lt;/I&gt; (&lt;I style="mso-bidi-font-style: normal"&gt;fold&lt;SUB&gt;T&lt;/SUB&gt;&lt;/I&gt; ((&lt;I style="mso-bidi-font-style: normal"&gt;I&lt;/I&gt; &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;In&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;) . &lt;I style="mso-bidi-font-style: normal"&gt;lambda&lt;/I&gt;) = &lt;I style="mso-bidi-font-style: normal"&gt;fold&lt;SUB&gt;T&lt;/SUB&gt;&lt;/I&gt; (&lt;I style="mso-bidi-font-style: normal"&gt;unfold&lt;SUB&gt;I&lt;/SUB&gt;&lt;/I&gt; (&lt;I style="mso-bidi-font-style: normal"&gt;lambda&lt;/I&gt; . (&lt;I style="mso-bidi-font-style: normal"&gt;T&lt;/I&gt; &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;out&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;))&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;(Read as: “Functional and OO programming is not too much different!”)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978764&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Towards refactoring&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;We can also use the developed machinery to refactor an OO program into a functional program (or vice versa). For instance, &lt;I style="mso-bidi-font-style: normal"&gt;in the direction of OO to functional programming&lt;/I&gt;, we first factor the OO program according to the steps (1.)—(4.), if possible. Then we set &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; = &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda1&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda2&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; = &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt;. Now, we attempt the steps (1.)—(4.) in inverse order so that the functional program is calculated. Likewise, the other direction can be accommodated. The refactoring fails if we hit a “case without counterpart”:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=a&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l11 level1 lfo7"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The occurrence of the data functor in the result position of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; seems to suggest that the implementation of any given operation for any given data variant can freely choose the data variant in the result of the operation. This is true for folds (read: constructor &lt;I style="mso-bidi-font-style: normal"&gt;x&lt;/I&gt; can be rewritten to constructor &lt;I style="mso-bidi-font-style: normal"&gt;y&lt;/I&gt;), but imposes a slight challenge on OO programming. That is, an OO method with “self’s” type in the result position of the interface functor must return an object of the same state type. The problem shows up when we attempted the inverse application of the co-tupling law (as part of deriving an OO program from a functional one), which may just fail when &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; was too liberal. We may overhaul the interface functor to use the recursive closure in place of “self”, but the expression lemma will no longer apply. Alternatively, we could stop refactoring before the application of the co-tupling law, but the resulting OO program would now designate one “class” to all data variants, which may count as failed decomposition.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt 0.25in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=a start=2&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l11 level1 lfo7"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;The occurrence of the interface functor in the argument position of &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;lambda&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; seems to suggest that the implementation of any given operation for any given data variant can freely refer to the results of applying any operations recursively on components of the data. This is true for functional objects (read as: method &lt;I style="mso-bidi-font-style: normal"&gt;x&lt;/I&gt; can call method &lt;I style="mso-bidi-font-style: normal"&gt;y&lt;/I&gt;), but imposes a slight challenge on functional programming. That is, if we start with the assumption that all functions should be &lt;I style="mso-bidi-font-style: normal"&gt;separate folds&lt;/I&gt;, then they cannot cross-reference each other. However, if we start from (or stop at) a tupled fold, the problem goes away. The problem shows up when we attempted the inverse application of the tupling law (as part of deriving a functional program from an OO one). If we assume that programmers can use the notation of general recursion, it is fair to further assume that the translation into folds directly returns a tupled fold. Hence, we do not face any proper limitation here.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoListParagraph style="MARGIN: 0in 0in 0pt; mso-add-space: auto"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 6pt"&gt;&lt;A class="" name=_Toc203978765&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Wrap-up&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;I hope some of you actually managed to get to the end of this text. I also hope that the text helps with improving the understanding of the fundamental correspondence between functional and OO programming. Of course, there are many loose ends that need more work. For instance, how do we deal with hard-core non-functional objects (when mutation and aliasing cannot be ignored)? Also, what are the exact mechanics of a refactoring transformation? Further, how does the state of the art in fold mining relate to the needs of our method? Yet further, what other ideas for refactoring OO to functional programs must be critically integrated to make a contribution to real-world scenarios such as multi-core parallelization? Finally, I realize that despite this long text, the presentation is still somewhat dense for someone not trained in Squiggol power and Haskell magic; so I hope that Ondrej and me end up writing a comprehensive tutorial on the full subject some day.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Have a great summer!&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Let me go back to the &lt;/FONT&gt;&lt;A href="http://www.mecklenburg-vorpommern-ostsee-insel.de/warnemuende_strand_hotel_informationen.html"&gt;&lt;FONT face=Calibri size=3&gt;beach&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; now that I have finished this quick post.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Ralf Lämmel&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8740294" width="1" height="1"&gt;</description></item><item><title>Research positions on Modeling and Analyzing Software Adaptation, University of Koblenz</title><link>http://blogs.msdn.com/ralflammel/archive/2008/07/15/research-positions-on-modeling-and-analyzing-software-adaptation-university-of-koblenz.aspx</link><pubDate>Tue, 15 Jul 2008 02:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8732343</guid><dc:creator>RalfLammel</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/8732343.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=8732343</wfw:commentRss><description>&lt;P&gt;The department of Computer Science, University Koblenz-Landau, Campus Koblenz invites applications for 2 research positions, available initially for 2 years:&lt;/P&gt;
&lt;P&gt;* 1 PostDoc&lt;BR&gt;* 1 PhD student&lt;/P&gt;
&lt;P&gt;The corresponding funding is part of the state of Rhineland Palatinate's Research Initiative 2008-2011. The successful applicants will work on the research theme of "ADAPT: Modeling and Analyzing Software Adaptation".&lt;/P&gt;
&lt;P&gt;The objective of ADAPT is to relate, advance, combine, and challenge adaptation methods and associated methods of modeling and analyzing that are used by the communities of software engineering, programming languages, logic-based modeling, multi-agent systems, formal methods, SOA, web systems, and mobile, autonomous systems. Please consult the ADAPT home page for further details: &lt;A href="http://adapt.uni-koblenz.de/"&gt;http://adapt.uni-koblenz.de/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;9 research groups from the CS department in Koblenz (from several of its institutes) are associated with the theme. Also, the theme leverages collaboration with international partners at the CWI,Amsterdam, and Chalmers University of Technology, Göteborg. The successful applicants will research in the interdisciplinary context of ADAPT, and be actively involved in further building up and refining the research theme. Thus, the positions provide extra opportunities for qualified applicants to distinguish themselves, in addition to the research aspects and the possibility to work on a dissertation and habilitation thesis.&lt;/P&gt;
&lt;P&gt;The deadline for applications is 1 September 2008. Email applications are preferred. See the contact section on the ADAPT home page.&lt;/P&gt;
&lt;P&gt;Participants:&lt;BR&gt;* Bernhard Beckert (Formal Methods and AI, Spokesperson)&lt;BR&gt;* Jürgen Ebert (Software Engineering)&lt;BR&gt;* Ulrich Furbach (Artificial Intelligence, Spokesperson)&lt;BR&gt;* Rüdiger Grimm (IT Risk Management)&lt;BR&gt;* Ralf Lämmel (Software Languages, Spokesperson)&lt;BR&gt;* Dietrich Paulus (Active Vision)&lt;BR&gt;* Steffen Staab (IS and Semantic Web)&lt;BR&gt;* Klaus Troitzsch (Empirical Methods, Modeling and Simulation)&lt;BR&gt;* Dieter Zöbel (Real-Time Systems and Mobile Systems Eng.)&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8732343" width="1" height="1"&gt;</description></item><item><title>SLE conference deadline approaching</title><link>http://blogs.msdn.com/ralflammel/archive/2008/07/15/sle-conference-deadline-approaching.aspx</link><pubDate>Tue, 15 Jul 2008 02:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8732336</guid><dc:creator>RalfLammel</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/8732336.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=8732336</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://planet-sl.org/sle2008/"&gt;http://planet-sl.org/sle2008/&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;1st International Conference on Software Language Engineering (SLE) &lt;/P&gt;
&lt;P&gt;There are&amp;nbsp;slightly extended deadlines:&lt;/P&gt;
&lt;P&gt;**Revised submission dates: Abstract submission: July 16th; Paper submission: July 21st** &lt;/P&gt;
&lt;P&gt;I also look fwd the following keynote speakers:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Anneke Kleppe, Capgemini, The Netherlands&lt;/LI&gt;
&lt;LI&gt;Mark van den Brand, Technical University of Eindhoven &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Obviously, I also look&amp;nbsp;fwd&amp;nbsp;being in Toulouse.&lt;/P&gt;
&lt;P&gt;The&amp;nbsp;next 2 weeks I am going to&amp;nbsp;enjoy the Baltic Sea though.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Regards,&lt;/P&gt;
&lt;P&gt;Ralf&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8732336" width="1" height="1"&gt;</description></item><item><title>Software Language Processing Samples (SLPS)</title><link>http://blogs.msdn.com/ralflammel/archive/2008/05/23/software-language-processing-samples-slps.aspx</link><pubDate>Fri, 23 May 2008 04:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8535773</guid><dc:creator>RalfLammel</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/8535773.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=8535773</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=4&gt;&lt;FONT color=#4f81bd&gt;&lt;FONT face=Cambria&gt;I am crazy about language processing&lt;I style="mso-bidi-font-style: normal"&gt;!&lt;/I&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;It is an excellent way to think deeply about &lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/Computer_programming"&gt;&lt;FONT face=Calibri size=3&gt;programming&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;, &lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/List_of_programming_languages"&gt;&lt;FONT face=Calibri size=3&gt;programming languages&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;, &lt;/FONT&gt;&lt;A href="http://www.amazon.com/Art-Metaobject-Protocol-Gregor-Kiczales/dp/0262610744"&gt;&lt;FONT face=Calibri size=3&gt;metaprogramming&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;, and it is the foundation of &lt;/FONT&gt;&lt;A href="http://www.informatik.uni-trier.de/~ley/db/journals/ase/index.html"&gt;&lt;FONT face=Calibri size=3&gt;automated software engineering&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;. Over the last 15 years or so I have written countless language processing components (parsers, pretty printers, transformations, etc.). Many of them originated in a teaching context. Others originated in the context of developing or exercising language processing infrastructures – as part of my research work. Yet others were implied by my continued interest in formal (and executable) semantics as well as type systems and program analysis. Further, I am a fan of declarative languages and programming methods (think of Haskell, Prolog, Attribute Grammars, DCGs, etc.) – language processing is a home match for declarative programming, and I am playing it every now and then. Finally, I have also worked on software re- and reverse engineering projects (both in industry and academia), and guess what, language processing is a recurring theme there.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 0pt"&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Language processing and teaching&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;These days, the software engineering and programming language communities discuss language processing-related issue a lot. Just think of all the intensive efforts focused at MDE, DSLs and &lt;/FONT&gt;&lt;A href="http://planet-sl.org/sle2008/"&gt;&lt;FONT face=Calibri size=3&gt;software language engineering&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;. The observable level of importance of language processing makes me wonder about some &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;educational&lt;/I&gt;&lt;/B&gt; aspects:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt 0.5in"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;How can one actively contribute to a matured body of conceptually founded and practically applicable knowledge about languages and language processing? How can one efficiently disperse such knowledge in university courses without though necessarily assuming entirely new courses?&lt;/I&gt;&lt;/B&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;The new SLPS project (read as Software Language Processing Samples) may hold one answer to these questions. SLPS is set up to collect samples that explore different &lt;I style="mso-bidi-font-style: normal"&gt;methods of language processing&lt;/I&gt;, different &lt;I style="mso-bidi-font-style: normal"&gt;languages under study&lt;/I&gt;, different &lt;I style="mso-bidi-font-style: normal"&gt;implementation languages and platforms&lt;/I&gt;, and different &lt;I style="mso-bidi-font-style: normal"&gt;auxiliary implementation technologies&lt;/I&gt; (e.g., parser generators). SLPS is a SourceForge project; see the &lt;/FONT&gt;&lt;A href="https://sourceforge.net/projects/slps/"&gt;&lt;FONT face=Calibri size=3&gt;project site&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; and the &lt;/FONT&gt;&lt;A href="http://slps.sourceforge.net/"&gt;&lt;FONT face=Calibri size=3&gt;project web site&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;. The project will hopefully grow into something useful that inspires programmers as much as university teachers. SLPS could become a community effort that collects programs of “a certain kind” – just as much as the sites “&lt;/FONT&gt;&lt;A href="http://99-bottles-of-beer.net/"&gt;&lt;FONT face=Calibri size=3&gt;99 Bottles of Beer&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;”, “&lt;/FONT&gt;&lt;A href="http://www2.latech.edu/~acm/HelloWorld.shtml"&gt;&lt;FONT face=Calibri size=3&gt;Hello World&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;”, or “&lt;/FONT&gt;&lt;A href="http://onestepback.org/articles/poly/"&gt;&lt;FONT face=Calibri size=3&gt;OO Shape Examples&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;”. This is a &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;call to arms&lt;/I&gt;&lt;/B&gt; for users and contributors. I am absolutely motivated and prepared to push this project for some time, but I hope that others see the value and join in. I readily leverage the value of the project in teaching, and consider the teaching value indeed to be the sweet spot of the project. (There may be an idea for a textbook in the air, subject to more thinking.)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 0pt"&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;The Factorial Language (FL)&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;To begin with, I have uploaded several implementations of the Factorial Language (FL) – a tiny functional programming language with first-order functions over integers. (&lt;/FONT&gt;&lt;A href="http://blogs.msdn.com/tiny_mce/jscripts/tiny_mce/Lukas%20Renggli"&gt;&lt;FONT face=Calibri size=3&gt;Lukas Renggli&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; has readily added an FL implementation based on Squeak.) The uploaded language processors parse, pretty-print, evaluate or optimize programs like the following:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt 0.25in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;mult n m = if (n==0) then 0 else (m + (mult (n - 1) m))&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt 0.25in"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Lucida Console'; mso-bidi-font-size: 11.0pt"&gt;fac n = if (n==0) then 1 else (mult n (fac (n - 1)))&lt;/SPAN&gt;&lt;/B&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;In case you didn’t guess it yet, the language’s name refers to its groundbreaking ability to express the factorial function. I have been told that the Fibonacci and the Ackermann functions can be expressed, too. This may be entirely possible. In the above snippet, we define both a &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;mult&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; and a &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;fac&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; function because there is no built-in multiplication; &lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Lucida Console'"&gt;mult&lt;/SPAN&gt;&lt;FONT face=Calibri&gt; is derived from built-in addition.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 0pt"&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;ANTLR, AspectJ, C#, Haskell, Java, Prolog, Smalltalk, Tom, XML, XSD, …&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Here are the existing FL implementations, as of writing: (i) a Haskell-based one using parser combinators for parsing, and generic functional programming (Data.Generics) for implementing an optimization; (ii) a Prolog-based one using DCG style for parsing; (iii) a Java-based one using ANTLR to parse concrete syntax, and plain old classes with virtual methods otherwise; (iv) another Java-based one using additionally TOM for implementing several operations by rewriting; (v) yet another Java-based one that bypasses concrete syntax, and uses XML and XSD instead, to which end it uses the JAXB approach for XML/object de-/serialization; the language processing operations are added as virtual methods by AspectJ’s intertype declaration; (vi) a Squeak-based one; (vii) two C#-based ones. I really look forward seeing additional FL implementations or entirely new groups of language processing samples.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt 0.5in"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;We may be able to grow this sample collection up to a point … (i) that it captures and demonstrates most if not all principles and methods of language processing, language-oriented programming, compiler construction, X/O/R mapping, XML- and grammar-based programming, program and software transformation, and, last but not least, formal semantics; (ii) that it showcases, compares, and evaluates popular or interesting language processing technology – such as combinator libraries (for parsing, pretty printing, transformation), DLS infrastructures and frameworks, Metamodeling technologies (e.g., based on EMF), and IDEs; and (iii) that it collects executable knowledge about languages – both the languages under study and the languages used for implementation.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/I&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Regards,&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Ralf&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8535773" width="1" height="1"&gt;</description></item><item><title>About the fundamental notion of software languages</title><link>http://blogs.msdn.com/ralflammel/archive/2008/03/27/about-the-fundamental-notion-of-software-languages.aspx</link><pubDate>Fri, 28 Mar 2008 00:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8340432</guid><dc:creator>RalfLammel</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/ralflammel/comments/8340432.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ralflammel/commentrss.aspx?PostID=8340432</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;The call for papers for the &lt;B style="mso-bidi-font-weight: normal"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;&lt;A href="http://planet-sl.org/sle2008/index.php"&gt;&lt;FONT color=#800080&gt;1st International Conference on Software Language Engineering&lt;/FONT&gt;&lt;/A&gt; (SLE) &lt;/I&gt;&lt;/B&gt;is public now. I am happy that we did all the work to start this new conference. I am 100% confident in the SLE conference; it’s backed up by a strong and self-confident community that has something to say about generic language technology, programming languages (incl. parsing, semantics, type checking), domain-specific languages, program transformation, software re- and reverse engineering, and model-driven development; it’s also backed up by the ample relevance of this area for the progress of IT, and the insight that the fundamental notion of languages cannot sufficiently be discussed within the scope of “technical spaces” alone (read as grammars, XML, UML, graph transformation, etc.). &lt;B style="mso-bidi-font-weight: normal"&gt;Have a look at the call&lt;/B&gt;. SLE 2008 will be co-located with MODELS 2008, September 29-30 October, in Toulouse, France.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;Disclaimer:&lt;/B&gt; A subjective perspective on SLE follows. Opinions expressed below are neither necessarily shared by my wife, nor by other SLE organizers and combatants, nor by my current/previous/future employers. Also, don’t take me too serious. Remember this is a blog, I am a Cobol+Haskell nerd, and I don’t use smilies, as a matter of style. As one of my SLE friends (namely, &lt;/FONT&gt;&lt;/FONT&gt;&lt;A href="http://megaplanet.org/jean-marie-favre/"&gt;&lt;FONT face=Calibri size=3&gt;JMF&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;) tends to say: “&lt;/FONT&gt;&lt;A href="http://www.youtube.com/watch?v=MgpzUo_kbFY"&gt;&lt;FONT face=Calibri color=#800080 size=3&gt;May the fun be with you.&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;” Indeed, SLE 2008 isn’t just an ambitious conference. We also want to have fun studying languages, being language nerds, comparing artificial and natural languages, engineering denotational semantics, hooking into popular IDEs, hacking parsers and type systems, and bashing XSD. Did I mention, BTW, that we meet up in Toulouse? Toulouse is not Bordeaux (“city of wine”), it’s not Lyon (“city of gastronomy”), but it means quality French wine and food; if you are stationed elsewhere in this world, then get some rest for a few days, and submit an unrejectable paper, or attend anyhow. In fact, I am just reading in a message from JMF: “Toulouse, a `haut lieu de la gastronomie francaise’". Watch your weight.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 0pt"&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;The IT Tower of Babel&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;BR&gt;&lt;FONT face=Calibri size=3&gt;Just as much as mankind has suffered from the construction of the (Biblical) &lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/Tower_of_Babel"&gt;&lt;FONT face=Calibri color=#800080 size=3&gt;Tower of Babel&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; and the subsequent &lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/Confusion_of_tongues"&gt;&lt;FONT face=Calibri color=#800080 size=3&gt;confusion of languages&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; (in fact, tongues), mankind (say, IT) is now suffering from the IT Tower of Babel – say the continuing emergence of always new (artificial) languages without much reliable ability to mediate between or to integrate or to evolve or to replace these languages; without even much shared understanding for the need for all these languages; overall: without much ability to deal with the increasing complexity of the pool of relevant languages in any given IT context.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Is the Tower of Babel a good metaphor? Admittedly, the (Biblical) Tower of Babel was simply an overambitious construction project that justly annoyed the chief architect (not of the building but of the universe) up to the point to punish the constructors with the confusion of languages; other punishments could have been chosen – such as blocking access to further construction material. In contrast, I use the term “IT Tower of Babel” to refer to the plethora of artificial languages as such. This plethora was not caused by &lt;/FONT&gt;&lt;A href="http://www.microsoft.com/presspass/exec/ozzie/default.mspx"&gt;&lt;FONT face=Calibri size=3&gt;Microsoft’s CSA&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; or any other major chief architect, but it’s pretty much a self-punishment of the IT community as a whole. We somehow ended up with all these artificial languages. Technology providers (say for compilers and platforms) certainly had a part in this: variation of language (read as programming language, any sort of tool-dependent file format) is often used for differentiation. Generally, applied computer science (let’s say “IT computer science”) is not quite an engineering science; it is so much affected by individuals, industry, fashion, and fiction. Finally, the emergence of artificial languages is subject to entropy; it seems &lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/Second_law_of_thermodynamics"&gt;&lt;FONT face=Calibri size=3&gt;we are just getting more&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; – no matter what.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Life was easy when there was only the &lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/Adamic_language"&gt;&lt;FONT face=Calibri color=#800080 size=3&gt;Adamic language&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;; IT life was easy when languages were in the hands of computer scientists (as opposed to language amateurs, not caring about semantics and program algebra); when there were just a few important programming languages: Cobol, C, Fortran, and not much more; when systems didn’t have to interoperate by means of C/S, SOA, WebServices; when there were just a few APIs per platform; when system owners were mostly happy with staying with their (evolving) platform for 1-3 decades. In fact, there were quite a few platforms (think of the mainframe age and the various Cobols; ask your grandpa), but that wasn’t too much of a fundamental problem; it merely provided job security for a small crowd of “interpreters” – specialists who could connect systems on different platforms in those relatively few cases when it was inevitable. (Read “few” in comparison to today’s standards.)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;The confusion of natural languages happened instantly, and it was fatal to the further construction of the (Biblical) Tower of Babel; suddenly we had 70-72 dialects – a number that is amazingly small for IT standards. In contrast, the confusion of artificial languages went through some stages, and it’s ongoing.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 0pt"&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Stage I: “Many programming languages”&lt;BR style="mso-special-character: line-break"&gt;&lt;BR style="mso-special-character: line-break"&gt;&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;The problem with the confusion of natural languages basically was that people lacked &lt;I style="mso-bidi-font-style: normal"&gt;translational power&lt;/I&gt; for the 70-72 dialects. Lacking this power, the offending building had to be abandoned. There are probably a &lt;I style="mso-bidi-font-style: normal"&gt;thousand&lt;/I&gt; programming languages in use, certainly if we count dialects and versions, even if we narrow down the number to business-critical languages – say languages used for business-critical software systems – as opposed to say languages for making &lt;/FONT&gt;&lt;A href="http://99-bottles-of-beer.net/abc.html"&gt;&lt;FONT face=Calibri color=#800080 size=3&gt;rhymes about beer&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;. Such a multitude of languages is a somewhat unsolved and serious problem in IT by itself (and not made easier by the continuing increase of languages); think of &lt;/FONT&gt;&lt;A href="http://www.cs.vu.nl/grammars/500.html"&gt;&lt;FONT face=Calibri size=3&gt;mass maintenance&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; or language conversion. The problem can be economically fatal for a system owner; lack of transformational and conversional power makes it impossible to keep up with inevitable evolution pressure. &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Now, you might say: “Lack of transformational and conversional power as in mass maintenance? This sounds like a Cobol problem to me. Cobol is for wimps; I am using Java or .NET, look at my beautiful refactoring support, lock at how I can &lt;/FONT&gt;&lt;A href="http://smallwiki.unibe.ch/adriankuhn/javacompiler/forceassertions/"&gt;&lt;FONT face=Calibri size=3&gt;patch this/that compiler&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; to give me (low-level) access to the parse-tree of a program.” &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Then try this: develop a converter from Java 1.1 to C# 3.0 applications; please send me an email, every now and then, how it goes. If you are among the top 10 of computer scientists worldwide, or an extraterrestrial hacker, you might get this done before &lt;/FONT&gt;&lt;A href="http://homepages.cwi.nl/~ralf/isabelle/"&gt;&lt;FONT face=Calibri size=3&gt;Isabelle&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; enters school, and you will sell it for more money than is needed to stop global warming locally in your county. &lt;B style="mso-bidi-font-weight: normal"&gt;That’s the point&lt;/B&gt;: shouldn’t we all work on making these things easy and repeatable and doable by folks with just one PhD? Let’s have 10 years of the new SLE conference, and see whether we can get closer to this goal!&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Want a different challenge? Then try this one: go and patch Squeak or any other major Smalltalk dialect so that it gets a decent amount of static checking, in fact, up to the degree that you would get in an &lt;/FONT&gt;&lt;A href="http://homepages.cwi.nl/~ralf/OOHaskell/"&gt;&lt;FONT face=Calibri size=3&gt;OO functional language with type inference&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;, modulo the necessary compromises to account for Smalltalk’s breathtaking expressiveness, most likely on the grounds of &lt;/FONT&gt;&lt;A href="http://lambda-the-ultimate.org/node/1625"&gt;&lt;FONT face=Calibri size=3&gt;soft typing&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;. Providing static typing for Smalltalk has been attempted a number of times (see &lt;/FONT&gt;&lt;A href="http://doi.acm.org/10.1145/165854.165893"&gt;&lt;FONT face=Calibri size=3&gt;Strongtalk&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;, for example), but it hasn’t been successful so far. Smalltalkers would absolutely appreciate additional checks, &lt;I style="mso-bidi-font-style: normal"&gt;as long as they don’t get into the way, as long as they do not remove expressiveness&lt;/I&gt;. I think that this is an extremely laudable attitude, and we just must get better software-language engineers to solve this problem, ultimately. In more general terms, Erik Meijer uses the slogan “&lt;/FONT&gt;&lt;A href="http://lambda-the-ultimate.org/node/834"&gt;&lt;FONT face=Calibri size=3&gt;Static Typing Where Possible, Dynamic Typing When Needed&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;”, and, of course, the assumption is that we extend our horizon as to what we call a type, as to the perhaps old-fashioned dichotomy of static types, dynamically checked assertions, and offline-proven program properties.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 0pt"&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Stage II: “Complex platforms”&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Even if you are a wizard of the C#, Java or VB syntax and semantics, you cannot write much else than “hello world” programs and the factorial function. In fact, “hello world” already requires some “library” knowledge.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;More generally, nobody can get real work done without profound knowledge of a platform. I want to make the point here that &lt;B style="mso-bidi-font-weight: normal"&gt;a platform is actually an overweight cocktail of languages&lt;/B&gt;: API signatures, API usage protocols, make/build/configuration descriptions, ontologies for semantic annotation (“custom attributes”), …, you name it. Further, the use of a typical platform is tied to the use of different data models in the average application: &lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/POJO"&gt;&lt;FONT face=Calibri size=3&gt;POJO&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;/&lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/Plain_Old_CLR_Object"&gt;&lt;FONT face=Calibri size=3&gt;POCO&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;, not so plain objects, a bit of relational model, and a bit of XML. (Defining schemes according to different data models, mapping between specific schemes, and mapping generically between different data models – these activities all count as software language engineering, in case, you didn’t notice.) Moreover, as a “platform user”, you use different type systems: Java 1.1, Java 1.5, C# ?.?, VB.NET ?.?, SQL, XSD, … – type systems are languages, too. Finally, you also use systems of designs patterns – again, these are languages.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Compare this to good old Cobol times, when you had an all-inclusive language (“hello world” works with the DISPLAY statement; data access works with the CRUD statements), and some pretty lean (and optional) tools for forms, reports, and structured programming. The data model of hierarchical indexed and sequential files was deeply embedded into Cobol. Can’t we just fix Cobol? It already has OO. We know how to do &lt;/FONT&gt;&lt;A href="http://homepages.cwi.nl/~ralf/AspectCobol/"&gt;&lt;FONT face=Calibri size=3&gt;aspects in Cobol&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;; even though the extension got accidentally obsoleted some decades ago. Let’s re-enable aspects, add a few more things, and then convert back to Cobol, worldwide. I’ll try to get the Haskell community aboard.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt; TEXT-ALIGN: justify"&gt;&lt;FONT face=Calibri size=3&gt;If we do not convert back to Cobol, we need to deeply understand platforms as cocktails of languages. You might say, “I don’t care much that these are languages; I just have to handle this complexity, call it language, call it software development reality. Again, I don’t care.” That’s the point: nobody cares, and the various languages are disintegrated; some of them are obfuscated; many of them are compromised. Also, they deadlock each other’s evolution and clean-up. Indeed, backwards compatibility deadlocks everything. &lt;I style="mso-bidi-font-style: normal"&gt;I have a dream: I imagine an (IT) world where the notion of backwards compatibility has stopped to frighten us; evolution is just so effective that we can always factor in ways that we see a system and a platform that represents the optimum in design conceivable by the time. &lt;/I&gt;(Perhaps, the Smalltalk folks &lt;/FONT&gt;&lt;A href="http://www.google.de/search?hl=en&amp;amp;client=firefox-a&amp;amp;rls=org.mozilla%3Aen-US%3Aofficial&amp;amp;hs=gvp&amp;amp;q=changeboxes&amp;amp;btnG=Search"&gt;&lt;FONT face=Calibri size=3&gt;can do it&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;? Come and talk at SLE 2008…!)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt; TEXT-ALIGN: justify"&gt;&lt;FONT face=Calibri size=3&gt;Again, we should be able to effectively &lt;B style="mso-bidi-font-weight: normal"&gt;refactor platforms&lt;/B&gt;. &lt;I style="mso-bidi-font-style: normal"&gt;First example&lt;/I&gt;: concepts that were previously in the build rules get suddenly deeply embedded into the language, or disappear from the programming surface because new kinds of compilers automate the concept. &lt;I style="mso-bidi-font-style: normal"&gt;Second example&lt;/I&gt;: How many XML APIs are there for Java? My bet is 42. Do we need all of them? Shouldn’t we be able to retire half of them or more? Should a Java program in 5 years from now even care about the dichotomy “in-memory” vs. “push/pull”? &lt;I style="mso-bidi-font-style: normal"&gt;Third example&lt;/I&gt;: if suddenly XSD is found to be &lt;/FONT&gt;&lt;A href="http://www.pluralsight.com/blogs/tewald/archive/2004/08/16/1892.aspx"&gt;&lt;FONT face=Calibri size=3&gt;too complicated&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;, can we just replace it all over our apps by the use of say RELAX NG? (Some XML bashers may even want to stretch this scenario, and transform away all XML in their apps. Now, let’s not overdo it, Ok?) &lt;I style="mso-bidi-font-style: normal"&gt;Fourth example&lt;/I&gt;: whenever a major language extension makes to our favorite programming language, we would like to retire design patterns that mimicked the same concepts previously, and we would like to do &lt;I style="mso-bidi-font-style: normal"&gt;mining&lt;/I&gt; so that lower-level program structures are semi-automatically lifted to the full, extended language. We have seen research on instances of this idea such as in aspect mining or refactoring for generics. How can we make this idea more repeatable? How can we define the higher-level language concepts in such a way in the first place that their relationships to design patterns or lower-level program structures follow from the language definition, and do not require heartbreaking proofs, after the fact? &lt;I style="mso-bidi-font-style: normal"&gt;Overall, shouldn’t we limit the entropy in IT? Otherwise, suddenly 50% percent of all human beings may end up working as programmers. Mark my words!&lt;/I&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 0pt"&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Stage III: “Complex interfaces”&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Even if you are a wizard of the .NET or Java platform, and have a Master’s in say financial services or “foundations” of eCommerce, you will still not be able to do a “MyAmazon” or “MyEBay” because this sort of application must interface with a good deal of other systems in quite complicated ways. First, the sheer size and the sheer number of interfaces that must be contented by the advanced web application are challenging. (For instance, have a look at &lt;/FONT&gt;&lt;A href="http://www.fpml.org/"&gt;&lt;FONT face=Calibri size=3&gt;FpML&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; – a sized (markup) language for financial products.) Second, the interfaces (or services) come with fundamentally different protocols and kinds of contracts (e.g., synchronous, asynchronous, reliable, occasionally connected, self-persisting, encrypted, session-based, etc., sigh!). Third, evolution is the straw to break the camel’s back. Software evolution, in the presence of complex platforms and complex interfaces is currently infeasible in theory, even though it occasionally works in practice – often by not admitting evolution. No matter whether it works or not, software evolution triggers interesting, additional artificial languages, e.g., transformation languages, and model/metamodels for reverse engineering.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;I guess WebServices with WSDL and friends was a first attempt to solve this problem. Does it work? Not for me! Whenever I see a .wsdl file, I am overwhelmed; I look somewhere else. I guess SOA is the current &lt;S style="text-line-through: double"&gt;hype&lt;/S&gt; way of addressing the problem. In both cases, the foremost emphasis is on &lt;I style="mso-bidi-font-style: normal"&gt;service description&lt;/I&gt; (based on some sort of signatures and protocols, again languages). In both cases, some efforts address the &lt;I style="mso-bidi-font-style: normal"&gt;discovery of services&lt;/I&gt;. In neither case, I am aware of a comprehensive approach to service evolution with all the encompassing problems of co-evolution and versioning. I really hope that the WebService/SOA community feels somewhat represented by and interested in SLE. I am sure that SLE will attract experts in programming languages, program transformation, language design, and programming environments; this sort of expertise should go well with the challenges in WebService/SOA. Let’s benefit from each other’s interests and strengths! Let’s meet at SLE 2008 in Toulouse.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 0pt"&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Stage IV: “&lt;/FONT&gt;&lt;A href="http://zone.citroen1.info/Xsara/claudia.htm"&gt;&lt;FONT face=Cambria color=#800080 size=4&gt;Driving models&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;”&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Model-driven engineering/development is partially meant as a solution to some of the problems mentioned in the descriptions of earlier stages. We should ignore the fact that MDE/MDD was initially touted as “vacuous fluff” on the OhMyGosh site, aka MDA. In fact, the idea of generating implementational artifacts from higher-level specifications or “models” is laudable and pretty established in CS, so MDA didn’t quite start the salvation of mankind; here are some distant references, &lt;/FONT&gt;&lt;A href="http://www.amazon.com/Specification-Transformation-Programs-Helmut-Partsch/dp/0387525890"&gt;&lt;FONT face=Calibri size=3&gt;[1]&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;, &lt;/FONT&gt;&lt;A href="http://dx.doi.org/10.1109/32.58788"&gt;&lt;FONT face=Calibri size=3&gt;[2]&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;, &lt;/FONT&gt;&lt;A href="http://portal.acm.org/citation.cfm?id=872&amp;amp;dl=&amp;amp;coll="&gt;&lt;FONT face=Calibri size=3&gt;[3]&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;, &lt;/FONT&gt;&lt;A href="http://dx.doi.org/10.1109/52.17799"&gt;&lt;FONT face=Calibri size=3&gt;[4]&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;, &lt;/FONT&gt;&lt;A href="http://dx.doi.org/10.1109/52.311067"&gt;&lt;FONT face=Calibri size=3&gt;[5]&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;, but I am not always sure what “model-driven” means – so these related work pointers are given without any underlying principle of what’s in and out. Nevertheless, I mention them here for the benefit of some of the disoriented PhD students that I occasionally encounter at conferences. &lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Perhaps my stupid problem with model-driven foo/bar is the following: Yes, sure, if … &lt;B style="mso-bidi-font-weight: normal"&gt;[fun_level++]&lt;/B&gt; … I start from a language setup with only brain-dead abstraction mechanisms, don’t care about the fundamental notions of refinement, translation, composition, partial evaluation, drive my efforts by the ideas of boxes, arrows, and stereotypes, add an amazingly complex constraint mechanism (like I would add the wings of an air shuttle to say a &lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/Trabant"&gt;&lt;FONT face=Calibri size=3&gt;Trabant&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;), invent a dozen notations for state machines of different kinds, throw hundreds of people at standardizing this Godzilla, … [keep on rambling for some time] …, then, yes, I &lt;I style="mso-bidi-font-style: normal"&gt;can&lt;/I&gt; &lt;S style="text-line-through: double"&gt;fly&lt;/S&gt; deliver very &lt;/FONT&gt;&lt;A href="http://images.google.de/images?q=expressionist"&gt;&lt;FONT face=Calibri size=3&gt;expressionistic pieces of art&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; (read as UML diagrams) meant as solutions for problems of even the &lt;/FONT&gt;&lt;A href="http://en.wikipedia.org/wiki/Hello_world_program"&gt;&lt;FONT face=Calibri size=3&gt;smallest size&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;, differing only in the degree of required masochistic orientation. &lt;B style="mso-bidi-font-weight: normal"&gt;[fun_level--]&lt;/B&gt; (I apologize for this imperative idiom, but it’s just too convenient.)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Anyway, if we just think of it as &lt;I style="mso-bidi-font-style: normal"&gt;program refinement, translation, composition, partial evaluation&lt;/I&gt; – then &lt;B style="mso-bidi-font-weight: normal"&gt;it all makes sense&lt;/B&gt;. So we just call it model-driven engineering, and try not to get stuck in bad memories of early MDA. No matter what, model-driven engineering is a software-language engineering challenge per excellence. We get additional languages (e.g., the language that is refined to be able to express distribution behavior after refactoring or refinement; think of POPL-powered explanation of the GWT); we get additional operations on languages (other than the obvious modes of compilation and interpretation). This creates (interesting) consistency challenges of a magnitude. Languages that arise due to well-defined refinement or translation are hard to argue away; so here I take the position that we better cope with them, make it easy to endorse them, and fully support their life cycle.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 0pt"&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Stage V: “Languages as underwear”&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;BR&gt;&lt;FONT face=Calibri size=3&gt;Toddlers develop their own natural language, and parents are motivated to catch up and understand them, sometimes imitate them. When friends come for dinner, parents even volunteer as interpreters, and everyone is happy and enjoys the individual language. It also makes sense because a full-blown dictionary and grammar is way too complex and inappropriate for the toddler’s ability and mind and focus. &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;Also, parents do parenting quite a bit for the entertainment value of toddlers, and those individual languages are part of the entertainment value, no? Also, the time frame for using these languages isn’t completely insane; the toddler is going to change diapers way more often than inventing a new baby language.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;In the emerging age of domain-specific languages, or should I say, in the current, more intensive &lt;/FONT&gt;&lt;A href="http://webpages.shepherd.edu/maustin/kuhn/kuhn.htm"&gt;&lt;FONT face=Calibri size=3&gt;wave of the long-standing DSL movement&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt;, we are suddenly able to change our artificial languages like underwear; introduce a new one, every day; use one per component of the application! To me, it is not strikingly obvious that this works, unless we impose appropriate constraints on this ability. (Come to SLE 2008, and tell us, how it works!) Taken to an extreme, “languages as underwear” would correspond to an adult who invents a new (natural) language every day or so, while assuming his colleagues, friends, and partner to catch up and learn this language pretty quickly. Perhaps, the adult is actually teaming up with a few buddies to justify the creation of the new language. Still, imagine &lt;I style="mso-bidi-font-style: normal"&gt;everyone&lt;/I&gt; being so creative &lt;I style="mso-bidi-font-style: normal"&gt;continuously&lt;/I&gt;. Let me emphasize that the creation of a special-purpose dictionary, or, let’s say, an ontology (to impose more structure on a dictionary) is Ok. I wonder … what’s fundamentally wrong with say English or German given these languages’ expressiveness? Getting back to artificial languages, what’s wrong with say Haskell 98+, provided we are getting depending typing, clever macros, and a few more gadgets. Then we will be “DSL complete” (as opposed to Turing complete).&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Here is a pretty non-controversial definition of the term “domain-specific language”: it’s a language with &lt;I style="mso-bidi-font-style: normal"&gt;domain-specific support&lt;/I&gt; for notation, abstraction mechanisms, checks, and behaviors (e.g., efficient behaviors based on domain-specific transformations). This sounds good. Sure, we do want the capability to define domain-specific languages. However, the dominating discussion of DSLs lacks some related, very important aspects. Suppose we are close to the point that it is easy to &lt;I style="mso-bidi-font-style: normal"&gt;define&lt;/I&gt; a DSL, don’t we also need the ability to &lt;I style="mso-bidi-font-style: normal"&gt;evolve&lt;/I&gt; them, &lt;I style="mso-bidi-font-style: normal"&gt;integrate&lt;/I&gt; them, &lt;I style="mso-bidi-font-style: normal"&gt;retire&lt;/I&gt; them, objectively &lt;I style="mso-bidi-font-style: normal"&gt;measure the impact&lt;/I&gt; of introducing them, or &lt;I style="mso-bidi-font-style: normal"&gt;analyze&lt;/I&gt; their usage and provide feedback for their evolution? Here I note that not even the mere definition of DSLs is a done deal, unless you are fan of attribute grammars, dependent typing, and a few more &lt;B style="mso-bidi-font-weight: normal"&gt;weapons of math-based distraction&lt;/B&gt;. It is relatively established to provide domain-specific notations, e.g., visual frontends on top of an object model; it is still relatively difficult to provide domain-specific checks, behaviors, and to support DSL evolution, again, unless you are a cutting-edge language nerd – to be clear and serious, I don’t consider myself nearly to be such an expert.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;H2 style="MARGIN: 10pt 0in 0pt"&gt;&lt;FONT face=Cambria color=#4f81bd size=4&gt;Conclusion&lt;/FONT&gt;&lt;/H2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;When the confusion of natural languages happened, it was at least clear that everyone was still talking in some language, even though people would no longer understand each other – too bad. Again, there wasn’t much dispute as to what a &lt;I style="mso-bidi-font-style: normal"&gt;language&lt;/I&gt; is. In CS, we have taken the confusion of languages to a new level. We are so overwhelmed by &lt;I style="mso-bidi-font-style: normal"&gt;language-like&lt;/I&gt; entities so that we do not simply lack the ability to understand the various languages at hand; worse than that – we do not even realize when “someone is talking”; we do not even “see” the language when it’s there. Also, we are caught up by details of rendering – comparable to someone who has no ability to deal with even the lowest degree of a dialect. It may also be that &lt;I style="mso-bidi-font-style: normal"&gt;we are too openly endorsing slang&lt;/I&gt;. By this I mean that the SLE-related areas of CS and IT could perhaps make better use of (and constructively challenge) the fundamental insights accumulated in parsing, formal semantics, programming languages, program transformation, testing, verification, literate programming, and general automated software engineering.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;We will inevitably see more languages (programming languages, APIs, DSLs, metalevel/transformation languages, ontologies, …). Understanding the software life cycle of all these languages is a central challenge for the CS discipline. We must improve our abilities to retire languages when they are no longer needed, objectively determine when a domain-specific language is worth designing, provide higher abstraction levels in programming, validate and verify language definitions or implementations, modularize them, think beyond the single-language frame, and endorse language integration and composition, … [ please check out the call for papers for SLE 2008 ] ….&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;FONT face=Calibri size=3&gt;Ralf Lämmel&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;A href="http://www.youtube.com/watch?v=OFpu0ROaPLQ"&gt;&lt;FONT face=Calibri size=3&gt;Wannabe&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri size=3&gt; Software Language Engineer&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8340432" width="1" height="1"&gt;</description></item></channel></rss>