<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-20359393</id><updated>2011-04-21T20:44:46.174-07:00</updated><category term='end-user programming'/><category term='data-driven computation'/><category term='TV'/><category term='solution'/><category term='IO'/><category term='gestural composition'/><category term='example'/><category term='graphics'/><category term='ICFP'/><category term='formatting'/><category term='poll'/><category term='GuiTV'/><category term='interactive visualization'/><category term='interactive programming'/><category term='libraries'/><category term='presentation'/><category term='partial values'/><category term='Haskell'/><category term='monoids'/><category term='Eros'/><category term='Phooey'/><category term='GUI programming'/><category term='arrows'/><category term='combinators'/><category term='functional programming'/><category term='TypeCompose'/><category term='applicative functors'/><category term='combinator libraries'/><category term='blogging'/><category term='DeepArrow'/><category term='writing'/><category term='spatial transformation'/><title type='text'>ConalBlog</title><subtitle type='html'>Technical notes on what I'm up to -- mainly functional programming.
This blog has been replaced.  Please
see &lt;a href="http://conal.net/blog"&gt;the new one&lt;/a&gt;.
I've moved the content over.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-20359393.post-9102696764627801914</id><published>2008-01-25T11:58:00.000-08:00</published><updated>2008-01-25T12:09:49.767-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><title type='text'>I have a new blog</title><content type='html'>I changed blog engines and sites, for reasons described in my &lt;a href="http://conal-elliott.blogspot.com/2008/01/blogging-and-formatted-code.html"&gt;previous post here&lt;/a&gt;.

The new blog is already on &lt;a href="http://planet.haskell.org/"&gt;Planet Haskell&lt;/a&gt;, but if you track my blog some other way, please switch to &lt;a href="http://conal.net/blog"&gt;the new one&lt;/a&gt;.

I'm very happy with my new set-up, which is &lt;a href="http://conal.net/blog/posts/switching-blog-engines/"&gt;much friendlier to Haskell code&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-9102696764627801914?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/9102696764627801914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=9102696764627801914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/9102696764627801914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/9102696764627801914'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2008/01/i-have-new-blog.html' title='I have a new blog'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-3387839819592920448</id><published>2008-01-14T16:05:00.000-08:00</published><updated>2008-01-14T16:14:27.655-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poll'/><category scheme='http://www.blogger.com/atom/ns#' term='formatting'/><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><title type='text'>Blogging and formatted code</title><content type='html'>I'd like to hear from anyone who is happy with their blogging engine's treatment of code.  I use Blogger, and it strips leading spaces from each line of my code on every edit/preview pass.  I lose alignment, and eventually, all the code ends up at the left margin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-3387839819592920448?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/3387839819592920448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=3387839819592920448' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/3387839819592920448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/3387839819592920448'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2008/01/blogging-and-formatted-code.html' title='Blogging and formatted code'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-1301609344004497032</id><published>2007-11-20T20:54:00.000-08:00</published><updated>2007-11-20T21:00:49.432-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='interactive programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Eros'/><category scheme='http://www.blogger.com/atom/ns#' term='TV'/><category scheme='http://www.blogger.com/atom/ns#' term='presentation'/><title type='text'>Tangible Functional Programming: a modern marriage of usability and composability</title><content type='html'>Earlier this month I gave a tech talk at Google, entitled "Tangible Functional Programming: a modern marriage of usability and composability".  Thanks to Google folks, &lt;a href="http://www.youtube.com/watch?v=faJ8N0giqzw"&gt;the talk is now up on YouTube&lt;/a&gt;.  I showed a way make functional programming "tangible" and visual, rather than abstract and syntactic and, in doing so, to fulfill the original Unix vision of simple, composable apps.

The key is to keep an app's interface and functionality combined and separable.  Combined yields usability, and separable yields composability.  This principle applies not only to GUI-style interfaces, but to textual IO as well, and it applies to both direct composition and syntactic composition.  See &lt;a href="http://haskell.org/haskellwiki/TV"&gt;the TV page&lt;/a&gt; for examples of the latter.  The common practice of mixing IO with functionality inhibits composability whether in C or in Haskell.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-1301609344004497032?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/1301609344004497032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=1301609344004497032' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/1301609344004497032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/1301609344004497032'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2007/11/tangible-functional-programming-modern.html' title='Tangible Functional Programming: a modern marriage of usability and composability'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-6446068585518817661</id><published>2007-07-09T22:19:00.000-07:00</published><updated>2007-07-09T22:43:17.672-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='arrows'/><category scheme='http://www.blogger.com/atom/ns#' term='interactive programming'/><category scheme='http://www.blogger.com/atom/ns#' term='combinator libraries'/><category scheme='http://www.blogger.com/atom/ns#' term='gestural composition'/><category scheme='http://www.blogger.com/atom/ns#' term='DeepArrow'/><category scheme='http://www.blogger.com/atom/ns#' term='ICFP'/><category scheme='http://www.blogger.com/atom/ns#' term='Eros'/><category scheme='http://www.blogger.com/atom/ns#' term='interactive visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='TV'/><category scheme='http://www.blogger.com/atom/ns#' term='Phooey'/><category scheme='http://www.blogger.com/atom/ns#' term='writing'/><title type='text'>"Tangible Functional Programming" -- icfp version</title><content type='html'>I just submitted the camera-ready version of "&lt;a href="http://conal.net/papers/Eros"&gt;Tangible Functional Programming&lt;/a&gt;", for &lt;a href="http://www.informatik.uni-bonn.de/%7Eralf/icfp07.html"&gt;ICFP '07&lt;/a&gt;.  I'm happy with this version.  It's improved drastically since my first submission to ICFP '06, thanks to many helpful comments.

I've also been recreating the implementation on top of &lt;a href="http://www.haskell.org/haskellwiki/DeepArrow"&gt;DeepArrow&lt;/a&gt;, &lt;a href="http://www.haskell.org/haskellwiki/Phooey"&gt;Phooey&lt;/a&gt;, and &lt;a href="http://www.haskell.org/haskellwiki/TV"&gt;TV&lt;/a&gt;, in preparation for a software release.  It's getting simpler, but it's not as simple as I want.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-6446068585518817661?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/6446068585518817661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=6446068585518817661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/6446068585518817661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/6446068585518817661'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2007/07/tangible-functional-programming-icfp.html' title='&quot;Tangible Functional Programming&quot; -- icfp version'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-6708454720477587709</id><published>2007-07-01T18:17:00.001-07:00</published><updated>2008-01-14T15:56:42.768-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='solution'/><category scheme='http://www.blogger.com/atom/ns#' term='libraries'/><category scheme='http://www.blogger.com/atom/ns#' term='monoids'/><category scheme='http://www.blogger.com/atom/ns#' term='Haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='partial values'/><title type='text'>Implementing a type for partial values</title><content type='html'>&lt;p&gt;&lt;span style="font-style: italic;"&gt;(Edit 2008-01-14: updated formatting.)&lt;/span&gt;
&lt;/p&gt;&lt;p&gt;In my &lt;a href="http://conal-elliott.blogspot.com/2007/07/type-for-partial-values.html" class="external text" title="http://conal-elliott.blogspot.com/2007/07/type-for-partial-values.html" rel="nofollow"&gt;previous post&lt;/a&gt;, I gave an interface for a type of "partial values" and invited implementations. Here's mine, which surprised me in its simplicity. The whole module is &lt;a href="http://conal.net/misc/Partial.hs" class="external text" title="http://conal.net/misc/Partial.hs" rel="nofollow"&gt;online&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;The trick is to represent &lt;code class="haskell"&gt;Partial a&lt;/code&gt; as &lt;code class="haskell"&gt;a &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; a&lt;/code&gt;, i.e., a way to selectively replace parts of a value.  Typically the replaced parts are bottom/undefined.  I want &lt;code class="haskell"&gt;Partial a&lt;/code&gt; to be a monoid, and &lt;code class="haskell"&gt;Data.Monoid&lt;/code&gt; provides an instance: &lt;/p&gt; &lt;pre class="haskell"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;-- | The monoid of endomorphisms under composition.&lt;/span&gt;
&lt;span style="color: rgb(0, 0, 153);"&gt;newtype&lt;/span&gt; Endo a = Endo &lt;span style="color:black;"&gt;{&lt;/span&gt; appEndo &lt;span style="color: rgb(0, 0, 153);"&gt;::&lt;/span&gt; a &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; a &lt;span style="color:black;"&gt;}&lt;/span&gt;

&lt;span style="color: rgb(0, 0, 153);"&gt;instance&lt;/span&gt; Monoid &lt;span style="color:black;"&gt;(&lt;/span&gt;Endo a&lt;span style="color:black;"&gt;)&lt;/span&gt; &lt;span style="color: rgb(0, 0, 153);"&gt;where&lt;/span&gt;
 mempty = Endo &lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:id"&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;id&lt;/span&gt;&lt;/a&gt;
 Endo f `mappend` Endo g = Endo &lt;span style="color:black;"&gt;(&lt;/span&gt;f &lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:."&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;.&lt;/span&gt;&lt;/a&gt; g&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;/pre&gt; &lt;p&gt;So my definition is simply a synonym: &lt;/p&gt; &lt;pre class="haskell"&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;type&lt;/span&gt; Partial = Endo&lt;/pre&gt; &lt;p&gt;Note that &lt;code class="haskell"&gt;mempty&lt;/code&gt; and &lt;code class="haskell"&gt;mappend&lt;/code&gt; do exactly what I want.  &lt;code class="haskell"&gt;mempty&lt;/code&gt; adds no information at all, while &lt;code class="haskell"&gt;u `mappend` v&lt;/code&gt; adds (overrides) information &lt;span style="font-family:monospace;"&gt;with &lt;/span&gt;&lt;code class="haskell"&gt;u&lt;/code&gt; and then with &lt;code class="haskell"&gt;v&lt;/code&gt;. &lt;/p&gt;&lt;p&gt;The implementation of functions on &lt;code class="haskell"&gt;Partial&lt;/code&gt; is trivial. &lt;/p&gt; &lt;pre class="haskell"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;-- | Convenience for partial-manipulating functions&lt;/span&gt;
inPartial &lt;span style="color: rgb(0, 0, 153);"&gt;::&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;a-&gt;a&lt;span style="color:black;"&gt;)&lt;/span&gt; &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;a'-&gt;a'&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt; &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; &lt;span style="color:black;"&gt;(&lt;/span&gt;Partial a &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; Partial a'&lt;span style="color:black;"&gt;)&lt;/span&gt;
inPartial f = Endo &lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:."&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;.&lt;/span&gt;&lt;/a&gt; f &lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:."&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;.&lt;/span&gt;&lt;/a&gt; appEndo

valp &lt;span style="color: rgb(0, 0, 153);"&gt;::&lt;/span&gt; c &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; Partial c
valp c = Endo &lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:const"&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;const&lt;/span&gt;&lt;/a&gt; c&lt;span style="color:black;"&gt;)&lt;/span&gt;

pval &lt;span style="color: rgb(0, 0, 153);"&gt;::&lt;/span&gt; Partial c &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; c
pval &lt;span style="color:black;"&gt;(&lt;/span&gt;Endo f&lt;span style="color:black;"&gt;)&lt;/span&gt; = f &lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:undefined"&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;undefined&lt;/span&gt;&lt;/a&gt;
unFst &lt;span style="color: rgb(0, 0, 153);"&gt;::&lt;/span&gt; Partial a &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; Partial &lt;span style="color:black;"&gt;(&lt;/span&gt;a,b&lt;span style="color:black;"&gt;)&lt;/span&gt;
unFst = inPartial first

unSnd &lt;span style="color: rgb(0, 0, 153);"&gt;::&lt;/span&gt; Partial b &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; Partial &lt;span style="color:black;"&gt;(&lt;/span&gt;a,b&lt;span style="color:black;"&gt;)&lt;/span&gt;
unSnd = inPartial second

unElt &lt;span style="color: rgb(0, 0, 153);"&gt;::&lt;/span&gt; &lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Functor"&gt;&lt;span style="color: rgb(51, 0, 51);"&gt;Functor&lt;/span&gt;&lt;/a&gt; f =&lt;span style="color: rgb(0, 102, 0);"&gt;&gt;&lt;/span&gt; Partial a &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; Partial &lt;span style="color:black;"&gt;(&lt;/span&gt;f a&lt;span style="color:black;"&gt;)&lt;/span&gt;
unElt = inPartial &lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:fmap"&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;fmap&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt; &lt;p&gt;I'm not sure I'll end up using the &lt;code class="haskell"&gt;Partial&lt;/code&gt; type in Eros, but I like having it around.  If you think of variations, extensions and/or other uses, please let me know.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-6708454720477587709?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/6708454720477587709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=6708454720477587709' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/6708454720477587709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/6708454720477587709'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2007/07/implementing-type-for-partial-values.html' title='Implementing a type for partial values'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-5235405784579625857</id><published>2007-07-01T17:47:00.000-07:00</published><updated>2008-01-14T15:58:44.292-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='libraries'/><category scheme='http://www.blogger.com/atom/ns#' term='monoids'/><category scheme='http://www.blogger.com/atom/ns#' term='Haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='partial values'/><title type='text'>A type for partial values</title><content type='html'>&lt;p&gt;&lt;span style="font-style: italic;"&gt;(Edit 2008-01-14: updated formatting.)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic;"&gt;
&lt;/span&gt;In simplifying my &lt;a href="http://conal.net/papers/Eros"&gt;Eros &lt;/a&gt;implementation, I came across a use for a type that represents partial information about values. I came up with a very simple implementation, though perhaps not quite ideal. In this post, I'll present the interface and invite ideas for implementation. In the next post, I'll give the implementation I use. &lt;/p&gt;&lt;p&gt;First the type: &lt;/p&gt; &lt;pre class="haskell"&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;type&lt;/span&gt; Partial a&lt;/pre&gt; &lt;p&gt;I require that &lt;code class="haskell"&gt;Partial a&lt;/code&gt; be a monoid, for which &lt;code class="haskell"&gt;mempty&lt;/code&gt; is the completely undefined value, and in &lt;code class="haskell"&gt;u `mappend` v&lt;/code&gt;, &lt;code class="haskell"&gt;v&lt;/code&gt; selectively replaces parts of &lt;code class="haskell"&gt;u&lt;/code&gt;.  (Lattice-wise, &lt;code class="haskell"&gt;mempty&lt;/code&gt; is bottom, and &lt;code class="haskell"&gt;mappend&lt;/code&gt; is not quite lub, as it lacks commutativity). &lt;/p&gt;&lt;p&gt;Now the programming interface: &lt;/p&gt; &lt;pre class="haskell"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;-- | Treat a full value as a partial one.  Fully overrides any&lt;/span&gt;
&lt;span style="color: rgb(102, 102, 102);"&gt;-- "previous" (earlier argument to mappend) partial value.&lt;/span&gt;
valp &lt;span style="color: rgb(0, 0, 153);"&gt;::&lt;/span&gt; c &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; Partial c

&lt;span style="color: rgb(102, 102, 102);"&gt;-- | Force a partial value into a full one, filling in bottom for any&lt;/span&gt;
&lt;span style="color: rgb(102, 102, 102);"&gt;-- missing parts.&lt;/span&gt;
pval &lt;span style="color: rgb(0, 0, 153);"&gt;::&lt;/span&gt; Partial c &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; c

&lt;span style="color: rgb(102, 102, 102);"&gt;-- | Inverse to fst, on partial values.  Inject info into the&lt;/span&gt;
&lt;span style="color: rgb(102, 102, 102);"&gt;-- the first half of a pair, and leave the second half alone.&lt;/span&gt;
unFst &lt;span style="color: rgb(0, 0, 153);"&gt;::&lt;/span&gt; Partial a &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; Partial &lt;span style="color:black;"&gt;(&lt;/span&gt;a,b&lt;span style="color:black;"&gt;)&lt;/span&gt;

&lt;span style="color: rgb(102, 102, 102);"&gt;-- | Inverse to snd.&lt;/span&gt;
unSnd &lt;span style="color: rgb(0, 0, 153);"&gt;::&lt;/span&gt; Partial b &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; Partial &lt;span style="color:black;"&gt;(&lt;/span&gt;a,b&lt;span style="color:black;"&gt;)&lt;/span&gt;

&lt;span style="color: rgb(102, 102, 102);"&gt;-- | Inverse to "element" access, on all elements.  A way to&lt;/span&gt;
&lt;span style="color: rgb(102, 102, 102);"&gt;-- inject some info about every element.  For f, consider&lt;/span&gt;
&lt;span style="color: rgb(102, 102, 102);"&gt;-- [], (-&gt;) a, Event, etc.&lt;/span&gt;
unElt &lt;span style="color: rgb(0, 0, 153);"&gt;::&lt;/span&gt; &lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:Functor"&gt;&lt;span style="color: rgb(51, 0, 51);"&gt;Functor&lt;/span&gt;&lt;/a&gt; f =&lt;span style="color: rgb(0, 102, 0);"&gt;&gt;&lt;/span&gt; Partial a &lt;span style="color: rgb(0, 0, 153);"&gt;-&gt;&lt;/span&gt; Partial &lt;span style="color:black;"&gt;(&lt;/span&gt;f a&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p&gt;That's it.  I'd love to hear ideas for representing &lt;code class="haskell"&gt;Partial a&lt;/code&gt; and implementing the functions above.  In the next post, I'll give mine.&lt;/p&gt;(July 3 edit: tweaked some indentation.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-5235405784579625857?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/5235405784579625857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=5235405784579625857' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/5235405784579625857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/5235405784579625857'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2007/07/type-for-partial-values.html' title='A type for partial values'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-5800739754528568007</id><published>2007-06-02T11:58:00.000-07:00</published><updated>2007-06-03T16:29:13.681-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='TypeCompose'/><category scheme='http://www.blogger.com/atom/ns#' term='data-driven computation'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI programming'/><category scheme='http://www.blogger.com/atom/ns#' term='applicative functors'/><category scheme='http://www.blogger.com/atom/ns#' term='Phooey'/><category scheme='http://www.blogger.com/atom/ns#' term='Haskell'/><title type='text'>Paper draft: "Applicative Data-Driven Computation"</title><content type='html'>&lt;div id="mb_0"&gt;I would love to get comments on a short (4.5 page) paper draft called "&lt;a href="http://www.haskell.org/haskellwiki/Applicative_Data-Driven_Programming"&gt;Applicative Data-Driven Computation&lt;/a&gt;" (Haskell wiki page), which  describes a very simple approach to data-driven (push-based) computation and its application to GUI programming.   There's a "Talk page" link for discussion.

I'm also very interested in suggestions and (better yet) collaboration on other applications of data-driven computation beyond GUIs, say push-based internet apps.

&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-5800739754528568007?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/5800739754528568007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=5800739754528568007' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/5800739754528568007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/5800739754528568007'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2007/06/paper-draft-applicative-data-driven.html' title='Paper draft: &quot;Applicative Data-Driven Computation&quot;'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-8252856706100364393</id><published>2007-03-30T13:17:00.000-07:00</published><updated>2007-03-30T13:22:31.118-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='TypeCompose'/><category scheme='http://www.blogger.com/atom/ns#' term='GuiTV'/><category scheme='http://www.blogger.com/atom/ns#' term='TV'/><category scheme='http://www.blogger.com/atom/ns#' term='Phooey'/><category scheme='http://www.blogger.com/atom/ns#' term='libraries'/><category scheme='http://www.blogger.com/atom/ns#' term='Haskell'/><title type='text'>Software releases: TypeCompose, Phooey, GuiTV</title><content type='html'>Three related software releases.  I am very interested in comments and contributions.

&lt;a href="http://haskell.org/haskellwiki/TypeCompose" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;TypeCompose&lt;/a&gt; provides some classes &amp; instances for forms of type composition. It also includes a very simple implementation of data-driven computation.  I factored it out of a new implementation of &lt;a href="http://haskell.org/haskellwiki/Phooey" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;Phooey&lt;/a&gt;.
&lt;span class="sg"&gt;
&lt;/span&gt;&lt;a href="http://haskell.org/haskellwiki/Phooey" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;Phooey&lt;/a&gt; is a library for functional user interfaces.  Highlights in this 0.3 release:
&lt;ul&gt;&lt;li&gt; Uses new &lt;a href="http://haskell.org/haskellwiki/TypeCompose" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt; TypeCompose&lt;/a&gt; package, which includes a simple implementation of data-driven computation.&lt;/li&gt;&lt;li&gt; New Applicative functor interface.&lt;/li&gt;&lt;li&gt; Eliminated the catch-all Phooey.hs module.  Now import any one of Graphics.UI.Phooey.{Monad ,Applicative,Arrow}.&lt;/li&gt;&lt;li&gt; Phooey.Monad has two different styles of output widgets, made by owidget and owidget'. The latter is used to implement Phooey.Applicative.&lt;/li&gt;&lt;li&gt; Self- and mutually-recursive widgets now work again in Phooey.Monad. They wedge in Phooey.Arrow and Phooey.Applicative.&lt;/li&gt;&lt;/ul&gt;Phooey is also used in &lt;a href="http://haskell.org/haskellwiki/GuiTV" title="GuiTV" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt; GuiTV&lt;/a&gt;, a library for composable interfaces and "tangible values".  I've also just updated GuiTV to 0.3, to sync with Phooey 1.0.
&lt;span class="sg"&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-8252856706100364393?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/8252856706100364393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=8252856706100364393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/8252856706100364393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/8252856706100364393'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2007/03/software-releases-typecompose-phooey.html' title='Software releases: TypeCompose, Phooey, GuiTV'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-6155825851094472170</id><published>2007-03-27T12:14:00.000-07:00</published><updated>2007-03-28T19:58:25.993-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='end-user programming'/><category scheme='http://www.blogger.com/atom/ns#' term='DeepArrow'/><category scheme='http://www.blogger.com/atom/ns#' term='ICFP'/><category scheme='http://www.blogger.com/atom/ns#' term='Eros'/><category scheme='http://www.blogger.com/atom/ns#' term='combinators'/><category scheme='http://www.blogger.com/atom/ns#' term='TV'/><title type='text'>ICFP '07 paper draft -- comments please</title><content type='html'>Warning: if you're on the ICFP program committee and want to preserve double-blind reviewing, please ignore this post.

I've been working on an ICFP paper called “&lt;a href="http://conal.net/papers/Eros"&gt;Tangible Functional Programming&lt;/a&gt;”, revising my last year's submission on Eros.  If you're interested in taking a look, I'd greatly appreciate any comments, especially before the April 6 submission deadline.

&lt;span style="font-weight: bold;"&gt;Abstract&lt;/span&gt;
&lt;blockquote&gt;  &lt;p&gt;We present a user-friendly approach to unifying program creation and  execution, based on a notion of “tangible values” (TVs), which are visible and interactive GUI manifestations of pure values. Programming happens by gestural  composition of TVs. Our goal is to give end-users the ability to  create parameterized, composable content without imposing the usual abstract and  linguistic working style of programmers. We hope that such a system will put the  essence of programming into the hands of many more people, and in particular  people with artistic/visual creative style.&lt;/p&gt;  &lt;p&gt;In realizing this vision, we develop algebras for visual presentation and for  “deep” function application, where function and argument may both be nested  within a structure of tuples, functions, etc. Composition gestures are  translated into chains of combinators that act simultaneously  on statically typed values and their visualizations.&lt;/p&gt; &lt;/blockquote&gt;&lt;p&gt;
&lt;/p&gt;&lt;p style="text-align: left;"&gt;Here is a figure from the paper, showing one stage of an interactively composed interactive 2D region. The user selects compatibly-typed input and output widgets, typically in different TVs. The result is a new TV that merges the source TVs, &lt;i&gt;except&lt;/i&gt; for the connected input and output, which vanish.  The sliders control the disk and checker sizes and the checker's rotation angle.&lt;/p&gt;&lt;p align="center"&gt;&lt;img src="http://conal.net/papers/Eros/png/make-diskChecker.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Edit&lt;/b&gt; on March 28:I just added two relevant pointers to the &lt;href=http: net="" papers="" eros=""&gt;paper's web page:&lt;/href=http:&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The &lt;a href="http://haskell.org/haskellwiki/TV"&gt;TV&lt;/a&gt; library page&lt;/li&gt;&lt;li&gt;The &lt;a href="http://haskell.org/haskellwiki/DeepArrow"&gt;DeepArrow&lt;/a&gt; library page&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-6155825851094472170?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/6155825851094472170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=6155825851094472170' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/6155825851094472170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/6155825851094472170'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2007/03/icfp-07-paper-draft-comments-please.html' title='ICFP &apos;07 paper draft -- comments please'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-2102630780333343222</id><published>2007-02-12T18:04:00.000-08:00</published><updated>2007-03-05T08:34:25.748-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='TV'/><category scheme='http://www.blogger.com/atom/ns#' term='IO'/><category scheme='http://www.blogger.com/atom/ns#' term='Haskell'/><title type='text'>separating IO from logic -- example</title><content type='html'>This post is a teaser for an article in my TiddlyWiki-based journal.  The article illustrates an approach to separating logic and IO using the &lt;a target="_blank" title="External link to  http://haskell.org/haskellwiki/TV" href="http://haskell.org/haskellwiki/TV" class="externalLink"&gt;TV&lt;/a&gt; library. The TV approach clarifies the pure logic part and the IO part and is more conveniently composable than the mixed logic/IO formulation.

I've just released TV-0.2, which omits GUI functionality.  That functionality is now present in the small new package &lt;a target="_blank" title="External link to  http://haskell.org/haskellwiki/GuiTV" href="http://haskell.org/haskellwiki/GuiTV" class="externalLink"&gt;GuiTV&lt;/a&gt;.  The reason for this split is that the GUI support depends on &lt;a target="_blank" title="External link to  http://wxhaskell.sourceforge.net" href="http://wxhaskell.sourceforge.net/" class="externalLink"&gt;wxHaskell&lt;/a&gt;, which currently can be difficult to install.  Only TV (not GuiTV) is needed for this example.

See &lt;a target="_blank" title="External link to  http://journal.conal.net/#%5B%5Bseparating%20IO%20from%20logic%20--%20example%5D%5D" href="http://journal.conal.net/#%5B%5Bseparating%20IO%20from%20logic%20--%20example%5D%5D" class="externalLink"&gt;the article here&lt;/a&gt;.

Technorati tags: &lt;a href="http://technorati.com/tag/FunctionalProgramming" rel="tag"&gt;FunctionalProgramming&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Haskell" rel="tag"&gt;Haskell&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Modularity" rel="tag"&gt;Modularity&lt;/a&gt;, &lt;a href="http://technorati.com/tag/DeclarativeInterfaces" rel="tag"&gt;DeclarativeInterfaces&lt;/a&gt;.

&lt;span style="font-weight: bold;"&gt;Edit of Feb 13&lt;/span&gt;: If you tried the TiddlyWiki article in Opera and got an error, please try again.  Problem fixed.  (Slight difference in regexp handling in Opera vs FF &amp; IE.)

&lt;span style="font-weight: bold;"&gt;Edit of March 5&lt;/span&gt;: This article was inspired by an example in Don Stewart's "&lt;a href="http://www.cse.unsw.edu.au/%7Edons/blog/2006/12/16#programming-haskell-intro"&gt;Programming Haskell&lt;/a&gt;" post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-2102630780333343222?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/2102630780333343222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=2102630780333343222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/2102630780333343222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/2102630780333343222'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2007/02/separating-io-from-logic-example.html' title='separating IO from logic -- example'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-3663388209255330399</id><published>2007-01-22T22:09:00.000-08:00</published><updated>2007-03-05T08:43:39.532-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DeepArrow'/><category scheme='http://www.blogger.com/atom/ns#' term='Eros'/><category scheme='http://www.blogger.com/atom/ns#' term='TV'/><category scheme='http://www.blogger.com/atom/ns#' term='Phooey'/><category scheme='http://www.blogger.com/atom/ns#' term='libraries'/><category scheme='http://www.blogger.com/atom/ns#' term='Haskell'/><title type='text'>Software releases</title><content type='html'>Last week I released three Haskell libraries: &lt;a href="http://haskell.org/haskellwiki/DeepArrow"&gt;DeepArrow&lt;/a&gt; 0.0, &lt;a href="http://haskell.org/haskellwiki/Phooey"&gt;Phooey&lt;/a&gt; 0.1, and &lt;a href="http://haskell.org/haskellwiki/TV"&gt;TV&lt;/a&gt; 0.0.

These libraries came from &lt;a href="http://conal.net/papers/Eros"&gt;Eros&lt;/a&gt;, which aims at creating a right-brain-friendly (concrete, non-linguistic) "programming" process. I've had a growing intuition over the last fifteen years that media authoring tools can be usefully looked at as environments for functional programming. I'd been wondering how to map a user's gestures into operations on a functional program. Lots of noodling led to ideas of composable interfaces and "tangible values" (term thanks to Sean Seefried) and gestural composition in Eros.

Eros is more complicated than I like, so I started splitting it into pieces:
&lt;ul&gt;&lt;li&gt; &lt;a href="http://haskell.org/haskellwiki/Phooey"&gt;Phooey&lt;/a&gt; is a functional GUI library that has much of Eros's GUI implementation techniques, but much more carefully structured than in the Eros paper.
&lt;/li&gt;&lt;li&gt; &lt;a href="http://haskell.org/haskellwiki/DeepArrow"&gt;DeepArrow&lt;/a&gt; has the general notion of "deep application"
&lt;/li&gt;&lt;li&gt; &lt;a href="http://haskell.org/haskellwiki/TV"&gt;TV&lt;/a&gt; has the algebra of &lt;i&gt;composable interfaces&lt;/i&gt;, or visualizations of pure values, and it has &lt;i&gt;tangible values&lt;/i&gt;, which are separable combinations of interface and value.  It uses Phooey to generate GUIs very simply from interfaces&lt;/li&gt;&lt;/ul&gt;Although these libraries came from Eros, I'd like to see other applications as well.

Where am I going with library development?
&lt;ul&gt;&lt;li&gt; Figure out how to support simple GUIs and Eros's &lt;em&gt;gesturally composable&lt;/em&gt; GUIs, without code/library replication.
&lt;/li&gt;&lt;li&gt; Re-implement Eros on top of simpler pieces.&lt;/li&gt;&lt;li&gt; Refactor &lt;a href="http://conal.net/Pajama"&gt;Pajama&lt;/a&gt; into reusable libraries and release.
&lt;ul&gt;&lt;li&gt;Building and optimizing "expressions"
&lt;/li&gt;&lt;li&gt;Common sub-expression elimination
&lt;/li&gt;&lt;li&gt;Generation of Java code&lt;/li&gt;&lt;li&gt;Perhaps other back-ends besides Java&lt;/li&gt;&lt;li&gt;Pajama, on top of these pieces&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
Technorati tags: &lt;a href="http://technorati.com/tag/FunctionalProgramming" rel="tag"&gt;FunctionalProgramming&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Haskell" rel="tag"&gt;Haskell&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Libraries" rel="tag"&gt;Libraries&lt;/a&gt;, &lt;a href="http://technorati.com/tag/DeclarativeInterfaces" rel="tag"&gt;DeclarativeInterfaces&lt;/a&gt;, &lt;a href="http://technorati.com/tag/FunctionalGUIs" rel="tag"&gt;FunctionalGUIs&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Reuse" rel="tag"&gt;Reuse&lt;/a&gt;.

&lt;span style="font-weight: bold;"&gt;Edit of March 5, 2007&lt;/span&gt;:  TV is now split into a core &lt;a dragover="true" href="http://haskell.org/haskellwiki/TV"&gt;TV&lt;/a&gt; package, with no GUI functionality, and &lt;a href="http://haskell.org/haskellwiki/GuiTV"&gt;GuiTV,&lt;/a&gt; with Phooey-based GUI creation.  The reason for the split is that &lt;a href="http://haskell.org/haskellwiki/Phooey"&gt;Phooey&lt;/a&gt; depends on &lt;a href="http://wxhaskell.sourceforge.net/"&gt;wxHaskell&lt;/a&gt;, which can be difficult to install.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-3663388209255330399?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/3663388209255330399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=3663388209255330399' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/3663388209255330399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/3663388209255330399'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2007/01/software-releases.html' title='Software releases'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-115819080586342619</id><published>2006-09-13T16:18:00.000-07:00</published><updated>2006-09-13T17:02:08.810-07:00</updated><title type='text'>New Pajama wiki</title><content type='html'>I set up a &lt;a href="http://pajama.conal.net"&gt;new wiki&lt;/a&gt; for Pajama (interactive, continuous, web-embeddable images).  Please try it out and leave comments on the wiki or email them to me.

I'm very interested in help with Pajama, particularly:
&lt;ul&gt;&lt;li&gt;Replacing the remaining old code from &lt;a href="http://conal.net/Pan"&gt;Pan&lt;/a&gt; (done while I was at Microsoft Research).  Most of the code has been rewritten and simplified, including the complicated code motion stuff (common subexpression elimination and loop hoisting), code generation (nicely exploiting Java), and GUI construction.&lt;/li&gt;&lt;li&gt;Getting it whipped into shape to be a open source project.&lt;/li&gt;&lt;li&gt;Applying the (domain-independent) compiler to other domains (sound, 3D, ...).&lt;/li&gt;&lt;li&gt;Improvements to the wiki, including easier uploading of examples and automatic generation of galleries.&lt;/li&gt;&lt;li&gt;Integration of Pajama and &lt;a href="http://pajama.conal.net/Eros"&gt;Eros&lt;/a&gt; (end-user syntax-free authoring of functional prorams).
&lt;/li&gt;&lt;/ul&gt;On wiki software selection:  After looking around at different engines, including a visit to #wiki and &lt;a href="http://www.wikimatrix.org/"&gt;WikiMatrix&lt;/a&gt;, I picked MoinMoin. It satisfies my requirements nicely: Java applet embedding (as generated by the Pajama compiler), free, wysiwyg page editing and a friendly implementation/extension language, namely Python. Then I started learning Python, which is a reasonably nice programming language for customizing the wiki server. My first Python program is a wiki macro that makes it fairly easy to embed Pajama effects in a wiki page.

&lt;div align="center"&gt;&lt;a href="http://pajama.conal.net"&gt;&lt;img src="http://conal.net/Pajama/thumbnails/tiled_lens_checker_cool_thumbnail.png" /&gt;
&lt;/a&gt;&lt;/div&gt;&lt;a href="http://conal.net/Pajama"&gt;&lt;/a&gt;
Technorati tags: &lt;a href="http://technorati.com/tag/Pajama" rel="tag"&gt;Pajama&lt;/a&gt;, &lt;a href="http://technorati.com/tag/FunctionalProgramming" rel="tag"&gt;FunctionalProgramming&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Haskell" rel="tag"&gt;Haskell&lt;/a&gt;, &lt;a href="http://technorati.com/tag/GraphicsProgramming" rel="tag"&gt;GraphicsProgramming&lt;/a&gt;, &lt;a href="http://technorati.com/tag/InfiniteGraphics" rel="tag"&gt;InfiniteGraphics&lt;/a&gt;, &lt;a href="http://technorati.com/tag/wiki" rel="tag"&gt;wiki&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-115819080586342619?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/115819080586342619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=115819080586342619' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/115819080586342619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/115819080586342619'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2006/09/new-pajama-wiki.html' title='New Pajama wiki'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-115799584924557365</id><published>2006-09-11T10:26:00.000-07:00</published><updated>2006-09-11T10:30:49.246-07:00</updated><title type='text'>Non-syntactic, end-user, functional programming</title><content type='html'>(This is an edited version of a post made on April 11 that somehow became inaccessible from my main blog page.)

I have a draft paper called “&lt;a href="http://conal.net/papers/Eros"&gt;Functional Programming by Interacting with Concrete Values&lt;/a&gt;”. I'm very excited about this research direction as a way to let people program without turning them into programmers.  A concrete form of this goal is enable artists to make and share their own software tools (parameterized image effects), while staying in an artistic creative mode.

An excerpt from the introduction:
&lt;blockquote&gt;Suppose &lt;i&gt;users&lt;/i&gt; of interactive programs could also create such programs with a simple extension of their current style of interaction.  First, such a development would enable many more people to create and share computational content.  Second, it would allow this content to be created without imposing the abstract, linguistic mode of creativity.  This freedom may give birth to new kinds of programs whose creation is nurtured by a concrete and visual environment.&lt;/blockquote&gt;Comments please (related work, ideas, typos, unclear bits, etc)!

Technorati tags: &lt;a href="http://technorati.com/tag/EndUserProgramming" rel="tag"&gt;EndUserProgramming&lt;/a&gt;, &lt;a href="http://technorati.com/tag/TangibleValues" rel="tag"&gt;TangibleValues&lt;/a&gt;, &lt;a href="http://technorati.com/tag/FunctionalProgramming" rel="tag"&gt;FunctionalProgramming&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-115799584924557365?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/115799584924557365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=115799584924557365' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/115799584924557365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/115799584924557365'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2006/09/non-syntactic-end-user-functional.html' title='Non-syntactic, end-user, functional programming'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-114497875593085177</id><published>2006-04-13T18:24:00.000-07:00</published><updated>2006-05-14T15:32:08.320-07:00</updated><title type='text'>P.S. to "Pajama site improved"</title><content type='html'>Please see this &lt;a href="http://conal-elliott.blogspot.com/2006/01/pajama.html"&gt;this January post&lt;/a&gt; for an overview of Pajama.

Pajama now runs on Java 1.4 and up, not just 1.5, thanks to &lt;a href="http://retroweaver.sourceforge.net"&gt;Retroweaver&lt;/a&gt;, a class file rewriter.

&lt;div align="center"&gt;
&lt;a href="http://conal.net/Pajama"&gt;&lt;img src="http://conal.net/Pan/Gallery/transparent/crop_swirl_checker_100.png" /&gt;
&lt;/a&gt;&lt;/div&gt;&lt;a href="http://conal.net/Pajama"&gt;&lt;/a&gt;

Technorati tags: &lt;a href="http://technorati.com/tag/Pajama" rel="tag"&gt;Pajama&lt;/a&gt;, &lt;a href="http://technorati.com/tag/FunctionalProgramming" rel="tag"&gt;FunctionalProgramming&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Haskell" rel="tag"&gt;Haskell&lt;/a&gt;, &lt;a href="http://technorati.com/tag/GraphicsProgramming" rel="tag"&gt;GraphicsProgramming&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-114497875593085177?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/114497875593085177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=114497875593085177' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/114497875593085177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/114497875593085177'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2006/04/ps-to-pajama-site-improved.html' title='P.S. to &quot;Pajama site improved&quot;'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-114478715847286365</id><published>2006-04-11T13:04:00.000-07:00</published><updated>2006-05-14T15:32:42.986-07:00</updated><title type='text'>Pajama site improved</title><content type='html'>The &lt;a href="http://conal.net/Pajama"&gt;Pajama&lt;/a&gt; site is much prettier &amp;amp; friendlier now, thanks to &lt;a href="http://hollyc.com"&gt;Holly&lt;/a&gt;.  She organized the image effects into several groups (with overlap), chose settings to show them off, and added “toy tips” suggesting what to try.

I would love to get comments and suggestions.
&lt;p align="center"&gt;
&lt;a href="http://conal.net/Pajama"&gt;&lt;img src="http://conal.net/Pajama/thumbnails/hybrid_swirled_half-space_thumbnail.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

Technorati tags: &lt;a href="http://technorati.com/tag/Pajama" rel="tag"&gt;Pajama&lt;/a&gt;, &lt;a href="http://technorati.com/tag/FunctionalProgramming" rel="tag"&gt;FunctionalProgramming&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Haskell" rel="tag"&gt;Haskell&lt;/a&gt;, &lt;a href="http://technorati.com/tag/GraphicsProgramming" rel="tag"&gt;GraphicsProgramming&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-114478715847286365?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/114478715847286365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=114478715847286365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/114478715847286365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/114478715847286365'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2006/04/pajama-site-improved.html' title='Pajama site improved'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-113722254062031649</id><published>2006-01-13T23:08:00.000-08:00</published><updated>2008-01-14T16:03:35.189-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='spatial transformation'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><title type='text'>Unifying and generalizing spatial transformation</title><content type='html'>&lt;p style="font-style: italic;"&gt;(Edit 2008-01-14: updated formatting.)&lt;/p&gt;&lt;p&gt;I’m trying out an idea I had a while back for unifying and generalizing different notions of spatial transformation in &lt;a href="http://conal.net/Pan"&gt;Pan&lt;/a&gt; (and spatial &amp;amp; temporal transformation in &lt;a href="http://conal.net/fran"&gt;Fran&lt;/a&gt;. The three notions are transforming a point, an image (which is a function from point to alpha), and an image filter (which is a function from image to image). A basic “transform” is a function from points to points. To transform a point, just apply the function. To transform an image, inversely transform the points fed into the image. To transform a filter, inversely transform the source image and forward transform the result image.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;type VectorE       = (DoubleE,DoubleE)
type PointE        = (DoubleE, DoubleE)
type Image c       = PointE -&amp;gt; c
type HyperFilter c = Filter c -&amp;gt; Filter c
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then for instance, scaling has these three variants:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;scaleP :: VectorE -&amp;gt; TransformE
scaleP (sx,sy) = \ (x,y) -&amp;gt; (sx * x, sy * y)

scale :: VectorE -&amp;gt; Filter c
scale (sx,sy) = (. scaleP (1/sx, 1/sy))

atScale :: VectorE -&amp;gt; HyperFilter c
atScale (sx,sy) xf =
  scale (sx,sy) . xf . scale(1/sx,1/sy)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hyperfilters allow some beautifully modular formulations of filters.&lt;/p&gt;&lt;p&gt;Note how in &lt;code&gt;scale&lt;/code&gt; and &lt;code&gt;atScale&lt;/code&gt;, I’m inverting the scaling. Exactly this pattern of inversion happens for other types of transformations as well (translation, rotation, swirl, etc). The new idea is to capture this inversion pattern once in a general rule for transforming &lt;em&gt;functions&lt;/em&gt;. A type class specifies types that can be spatially transformed, which is direct for points, a do-nothing for numbers and booleans, distributes over tupling, and works similarly to &lt;code&gt;atScale&lt;/code&gt; above for functions. To make this fly, I’m changing my representation of points and vectors from pairs to data types, which makes the code less succinct but is more strongly typed.&lt;/p&gt;&lt;p&gt;There’s a big catch in this plan: I only know how to handle &lt;em&gt;invertible&lt;/em&gt; transformations, which rules out, e.g., tiling.&lt;/p&gt;&lt;p&gt;Here’s the class of transformable values:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;class ITrans a where
  iTrans :: ITransformE -&amp;gt; a -&amp;gt; a
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and the handling of functions:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;instance (ITrans a, ITrans b) =&amp;gt; ITrans (a-&amp;gt;b) where
iTrans xf f = iTrans xf . f . iTrans (invIT xf)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The type of invertible transforms simply has a pair of transforms:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;data ITransformE =
  ITransformE { itForward  :: TransformE
              , itBackward :: TransformE }

invIT :: ITransformE -&amp;gt; ITransformE
invIT (ITransformE forw back) = ITransformE back forw
&lt;/code&gt;&lt;/pre&gt;Besides doing what I already do more uniformly, this generalized approach to transformation should be just the thing for &lt;it&gt;interactive &lt;/it&gt;images, which may be neatly formulated again, as functions.&lt;div align="center"&gt;
&lt;a href="http://conal.net/Pan/Gallery/intro/medres/neal%20tiled.jpg"&gt;&lt;img src="http://conal.net/Pan/Gallery/transparent/neal_tiled_small.png" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;div style="clear: both; padding-bottom: 0.25em;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-113722254062031649?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/113722254062031649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=113722254062031649' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/113722254062031649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/113722254062031649'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2006/01/unifying-and-generalizing-spatial.html' title='Unifying and generalizing spatial transformation'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20359393.post-113701043965717575</id><published>2006-01-11T12:13:00.000-08:00</published><updated>2006-05-14T15:33:31.880-07:00</updated><title type='text'>Pajama!</title><content type='html'>I am working on a new implementation, called &lt;i&gt;Pajama&lt;/i&gt;, of the image synthesis embedded language &lt;a href="http://conal.net/Pan"&gt;Pan&lt;/a&gt;, this time generating Java applets.  The advantages over Pan will be
&lt;ul&gt; &lt;li&gt;Easy to run examples.  Anyone with Java 1.5 or better can simply visit a web page to see and interact with the examples.&lt;/li&gt;&lt;li&gt;Examples run on all major platforms (wherever Java 1.5 runs), while Pan ran on Windows only.&lt;/li&gt;&lt;li&gt;The Pajama compiler runs on all platforms supporting GHC and the java compiler. In contrast, the Pan compiler ran only under Windows and only with Microsoft's Visual C++ compiler. Worse yet, Pan used a GUI library (WTL) that Microsoft no longer supports. I haven't been able to run the Pan compiler for quite a while now.
&lt;/li&gt; &lt;/ul&gt; The disadvantage of Pajama over Pan is speed. Trig speed is quite a bit slower, and I suspect array accesses are also. Mustang (Java 1.6) improves trig performance considerably, though only with the server JVM, but almost everyone would be using the client JVM. I hope speed improves over time.

Quite a lot of Pajama is already working.  I have first examples running &lt;a href="http://conal.net/Pajama"&gt;here&lt;/a&gt;.  More on the way.
&lt;div align="center"&gt;
&lt;a href="http://conal.net/Pan/Gallery/cornucopia/"&gt;&lt;img src="http://conal.net/Pan/Gallery/transparent/cornucopia/small/05.png" /&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;span style="font-weight: bold;"&gt;April 13 edit&lt;/span&gt;:  Pajama now runs on Java 1.4 and up, not just 1.5, thanks to &lt;a href="http://retroweaver.sourceforge.net/"&gt;Retroweaver&lt;/a&gt;, a class file rewriter.

Technorati tags: &lt;a href="http://technorati.com/tag/Pajama" rel="tag"&gt;Pajama&lt;/a&gt;, &lt;a href="http://technorati.com/tag/FunctionalProgramming" rel="tag"&gt;FunctionalProgramming&lt;/a&gt;, &lt;a href="http://technorati.com/tag/Haskell" rel="tag"&gt;Haskell&lt;/a&gt;, &lt;a href="http://technorati.com/tag/GraphicsProgramming" rel="tag"&gt;GraphicsProgramming&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20359393-113701043965717575?l=conal-elliott.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conal-elliott.blogspot.com/feeds/113701043965717575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20359393&amp;postID=113701043965717575' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/113701043965717575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20359393/posts/default/113701043965717575'/><link rel='alternate' type='text/html' href='http://conal-elliott.blogspot.com/2006/01/pajama.html' title='Pajama!'/><author><name>Conal</name><uri>http://www.blogger.com/profile/05756984502464196668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://conal.net/conal.jpg'/></author><thr:total>0</thr:total></entry></feed>
