<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Conal Elliott &#187; library</title>
	<atom:link href="http://conal.net/blog/tag/library/feed" rel="self" type="application/rss+xml" />
	<link>http://conal.net/blog</link>
	<description>Inspirations &#38; experiments, mainly about denotative/functional programming in Haskell</description>
	<lastBuildDate>Thu, 25 Jul 2019 18:15:11 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.1.17</generator>
	<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=conal&amp;popout=1&amp;url=http%3A%2F%2Fconal.net%2Fblog%2F&amp;language=en_US&amp;category=text&amp;title=Conal+Elliott&amp;description=Inspirations+%26amp%3B+experiments%2C+mainly+about+denotative%2Ffunctional+programming+in+Haskell&amp;tags=blog" type="text/html" />
	<item>
		<title>Merging partial values</title>
		<link>http://conal.net/blog/posts/merging-partial-values</link>
		<comments>http://conal.net/blog/posts/merging-partial-values#comments</comments>
		<pubDate>Sat, 22 Nov 2008 05:41:17 +0000</pubDate>
		<dc:creator><![CDATA[Conal]]></dc:creator>
				<category><![CDATA[Functional programming]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[lub]]></category>
		<category><![CDATA[partial value]]></category>
		<category><![CDATA[unamb]]></category>

		<guid isPermaLink="false">http://conal.net/blog/?p=62</guid>
		<description><![CDATA[Last year I stumbled across a simple representation for partial information about values, and wrote about it in two posts, A type for partial values and Implementing a type for partial values. Of particular interest is the ability to combine two partial values into one, combining the information present in each one. More recently, I [&#8230;]]]></description>
				<content:encoded><![CDATA[<!-- 

Title: Merging partial values

Tags: partial value, unamb, lub, library

URL: http://conal.net/blog/posts/merging-partial-values/

-->

<!-- references -->

<!-- teaser -->

<p>Last year I stumbled across a simple representation for partial information about values, and wrote about it in two posts, <em><a href="http://conal.net/blog/posts/a-type-for-partial-values/" title="blog post">A type for
partial values</a></em> and <em><a href="http://conal.net/blog/posts/implementing-a-type-for-partial-values/" title="blog post">Implementing a type for partial values</a></em>.
Of particular interest is the ability to combine two partial values into one, combining the information present in each one.</p>

<p>More recently, I played with <em>unambiguous choice</em>, described in <a href="http://conal.net/blog/posts/functional-concurrency-with-unambiguous-choice/" title="blog post">the previous post</a>.</p>

<p>This post combines these two ideas.
It describes how to work with partial values in Haskell <em>natively</em>, i.e., without using any special representation and without the use
restrictions of unambiguous choice.
I got inspired to try removing those restrictions during <a href="http://tunes.org/~nef/logs/haskell/08.11.17">stimulating discussions</a> with Thomas Davie, Russell O&#8217;Connor others in the #haskell gang.</p>

<p>You can download and play with the library shown described here.
There are links and a bit more info on the <a href="http://haskell.org/haskellwiki/lub" title="wiki page">lub wiki page</a>.</p>

<p><strong>Edits</strong>:</p>

<ul>
<li>2008-11-22: Fixed link: <em><a href="http://conal.net/blog/posts/implementing-a-type-for-partial-values/" title="blog post">Implementing a type for partial values</a></em></li>
<li>2008-11-22: Tidied introduction</li>
</ul>

<!-- without a comment or something here, the last item above becomes a paragraph -->

<p><span id="more-62"></span></p>

<h3>Information, more or less</h3>

<p><img style="float: right;" src="http://conal.net/blog/pictures/semantic-lattice.png"/></p>

<p>The meanings of programming languages are often defined via a technique called &#8220;denotational semantics&#8221;.
In this style, one specifies a mathematical model, or <em>semantic domain</em>, for the meanings of utterances in the and then writes what looks
like a recursive functional program that maps from syntax to semantic domain.
That &#8220;program&#8221; defines the semantic function.
Really, there&#8217;s one domain and one semantic function each syntactic category.
In typed languages like Haskell, every type has an associated semantic domain.</p>

<p>One of the clever ideas of the theory of semantic domains (&#8220;domain theory&#8221;) is to place a partial ordering on values (domain members),
based on <em>information content</em>.
Values can not only be equal and unequal, they can also have more or less information content than each other.
The value with the least information is at the bottom of this ordering, and so is called &#8220;bottom&#8221;, often written as &#8220;⊥&#8221;.
In Haskell, ⊥ is the meaning of &#8220;<code>undefined</code>&#8220;.
For succinctness below, I&#8217;ll write &#8220;⊥&#8221; instead of &#8220;<code>undefined</code>&#8221; in Haskell code.</p>

<p>Many types have corresponding <em>flat</em> domains, meaning that the only values are either completely undefined completely defined.
For instance, the Haskell type <code>Integer</code> is (semantically) flat.
Its values are all either ⊥ or integers.</p>

<p>Structured types are not flat.
For instance, the meaning of (i.e., the domain corresponding to) the Haskell type <code>(Bool,Integer)</code> contains five different kinds of
values, as shown in the figure.
Each arrow leads from a less-defined (less informative) value to a more-defined value.</p>

<p>To handle the diversity of Haskell types, define a class of types for which we know how to compute lubs.</p>

<pre><code>class HasLub a where (⊔) :: a -&gt; a -&gt; a
</code></pre>

<p>The actual <a href="http://haskell.org/haskellwiki/lub" title="wiki page">lub library</a>, uses &#8220;<code>lub</code>&#8221; instead of &#8220;<code>(⊔)</code>&#8220;.</p>

<p>The arguments must be <em>consistent</em>, i.e., must have a common upper bound.
This precondition is <em>not</em> checked statically or dynamically, so the programmer must take care.</p>

<h3>Flat types</h3>

<p>For flat types, <code>(⊔)</code> is equivalent to <code>unamb</code> (see <em><a href="http://conal.net/blog/posts/functional-concurrency-with-unambiguous-choice/" title="blog post">Functional concurrency with unambiguous choice</a></em>), so</p>

<pre><code>-- Flat types:
instance HasLub ()      where (⊔) = unamb
instance HasLub Bool    where (⊔) = unamb
instance HasLub Char    where (⊔) = unamb
instance HasLub Integer where (⊔) = unamb
instance HasLub Float   where (⊔) = unamb
...
</code></pre>

<h3>Pairs</h3>

<h4>Too strict</h4>

<p>We can handle pairs easily enough:</p>

<pre><code>instance (HasLub a, HasLub b) =&gt; HasLub (a,b) where
  (a,b) ⊔ (a',b') = (a ⊔ a', b ⊔ b')
</code></pre>

<p>but we&#8217;d be wrong!  This definition is too strict, e.g.,</p>

<pre><code>(1,2) ⊔ ⊥ == ⊥
</code></pre>

<p>when we&#8217;d want <code>(1,2)</code>.</p>

<h4>Too lazy</h4>

<p>No problem.  Just make the patterns lazy:</p>

<pre><code>instance (HasLub a, HasLub b) =&gt; HasLub (a,b) where
  ~(a,b) ⊔ ~(a',b') = (a ⊔ a', b ⊔ b')
</code></pre>

<p>Oops &#8212; wrong again.  This definition is too lazy:</p>

<pre><code>⊥ ⊔ ⊥ == (⊥,⊥)
</code></pre>

<p>when we&#8217;d want ⊥.</p>

<h4>Almost</h4>

<p>We can fix the too-lazy version by checking that one of the arguments is non-bottom, which is what <code>seq</code> does.
Which one to we check?  The one that isn&#8217;t <code>⊥</code>, or either one if they&#8217;re both defined.
Our friend <code>unamb</code> can manage this task:</p>

<pre><code>instance (HasLub a, HasLub b) =&gt; HasLub (a,b) where
  ~p@(a,b) ⊔ ~p'@(a',b') =
    (p `unamb` p') `seq` (a ⊔ a', b ⊔ b')
</code></pre>

<p>But there&#8217;s a catch (which I realized only now): <code>p</code> and <code>p'</code> may not satisfy the     precondition on <code>unamb</code>.
(If they did, we could use <code>(⊔) = unamb</code>.)</p>

<h4>Just right</h4>

<p>To fix this last problem, check whether each pair is defined.
We can&#8217;t know which to check first, so test concurrently, using <code>unamb</code>.</p>

<pre><code>instance (HasLub a, HasLub b) =&gt; HasLub (a,b) where
  ~p@(a,b) ⊔ ~p'@(a',b') =
    (definedP p `unamb` definedP p')
    `seq` (a ⊔ a', b ⊔ b')
</code></pre>

<p>where</p>

<pre><code>definedP :: (a,b) -&gt; Bool
definedP (_,_) = True
</code></pre>

<p>The implicit second case in that definition is <code>definedP ⊥ = ⊥</code>.</p>

<p>Some examples:</p>

<pre><code>*Data.Lub&gt; (⊥,False) ⊔ (True,⊥)
(True,False)
*Data.Lub&gt; (⊥,(⊥,False)) ⊔ ((),(⊥,⊥)) ⊔ (⊥,(True,⊥))
((),(True,False))
</code></pre>

<h3>Sums</h3>

<p>For sums, we&#8217;ll discriminate between lefts and rights, with the following assistants:</p>

<pre><code>isL :: Either a b -&gt; Bool
isL = either (const True) (const False)

outL :: Either a b -&gt; a
outL = either id (error "outL on Right")

outR :: Either a b -&gt; b
outR = either (error "outR on Left") id
</code></pre>

<p>The <code>(⊔)</code> method for sums unwraps its arguments as a <code>Left</code> or as a <code>Right</code>, after checking which kind of arguments it gets.
We can&#8217;t know which one to check first, so check concurrently:</p>

<pre><code>instance (HasLub a, HasLub b) =&gt; HasLub (Either a b) where
  s ⊔ s' = if isL s `unamb` isL s' then
             Left  (outL s ⊔ outL s')
           else
             Right (outR s ⊔ outR s')
</code></pre>

<div class="exercise">

<p><strong>Exercise:</strong> Why is the use of <code>unamb</code> here legal?</p>

</div>

<h3>Functions</h3>

<p>A function <code>f</code> is said to be less (or equally) defined than a function <code>g</code> when <code>f</code> is less (or equally) defined <code>g</code> for <em>every</em> argument
value.
Consequently,</p>

<pre><code>instance HasLub b =&gt; HasLub (a -&gt; b) where
  f ⊔ g =  a -&gt; f a ⊔ g a
</code></pre>

<p>More succinctly:</p>

<pre><code>instance HasLub b =&gt; HasLub (a -&gt; b) where (⊔) = liftA2 (⊔)
</code></pre>

<h3>Other types</h3>

<p>We&#8217;ve already handled the unit type <code>()</code>, other flat types, pairs, sums, and functions.
Algebraic data types can be modeled via this standard set, with a technique from generic programming.
Define methods that map to and from a type in the standard set.</p>

<pre><code>class HasRepr t r | t -&gt; r where
  -- Required: unrepr . repr == id
  repr   :: t -&gt; r  --  to repr
  unrepr :: r -&gt; t  -- from repr
</code></pre>

<p>We can implement <code>(⊔)</code> on a type by performing a <code>(⊔)</code> on that type&#8217;s standard representation, as follows:</p>

<pre><code>repLub :: (HasRepr a v, HasLub v) =&gt; a -&gt; a -&gt; a
a `repLub` a' = unrepr (repr a ⊔ repr a')

instance (HasRepr t v, HasLub v) =&gt; HasLub t where
  (⊔) = repLub
</code></pre>

<p>However, this rule would overlap with all other <code>HasLub</code> instances, because Haskell instance selection is based only on the <em>head</em> of an instance definition, i.e., the part after the &#8220;<code>=&gt;</code>&#8220;.
Instead, we&#8217;ll define a <code>HasLub</code> instance per <code>HasRepr</code> instance.</p>

<p>For instance, here are encodings for <code>Maybe</code> and for lists:</p>

<pre><code>instance HasRepr (Maybe a) (Either () a) where
  repr   Nothing   = (Left ())
  repr   (Just a)  = (Right a)

  unrepr (Left ()) = Nothing
  unrepr (Right a) = (Just a)

instance HasRepr [a] (Either () (a,[a])) where
  repr   []             = (Left  ())
  repr   (a:as)         = (Right (a,as))

  unrepr (Left  ())     = []
  unrepr (Right (a,as)) = (a:as)
</code></pre>

<p>And corresponding <code>HasLub</code> instances:</p>

<pre><code>instance HasLub a =&gt; HasLub (Maybe a) where (⊔) = repLub
instance HasLub a =&gt; HasLub [a]       where (⊔) = repLub
</code></pre>

<p>Testing:</p>

<pre><code>*Data.Lub&gt; [1,⊥,2] ⊔ [⊥,3,2]
[1,3,2]
</code></pre>
<p><a href="http://conal.net/blog/?flattrss_redirect&amp;id=62&amp;md5=69122ab875d3fd4e649aa0b3975f8dd4"><img src="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png" srcset="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@2x.png 2xhttp://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@3x.png 3x" alt="Flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://conal.net/blog/posts/merging-partial-values/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=conal&amp;popout=1&amp;url=http%3A%2F%2Fconal.net%2Fblog%2Fposts%2Fmerging-partial-values&amp;language=en_GB&amp;category=text&amp;title=Merging+partial+values&amp;description=Last+year+I+stumbled+across+a+simple+representation+for+partial+information+about+values%2C+and+wrote+about+it+in+two+posts%2C+A+type+for+partial+values+and+Implementing+a+type+for...&amp;tags=library%2Club%2Cpartial+value%2Cunamb%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Functional concurrency with unambiguous choice</title>
		<link>http://conal.net/blog/posts/functional-concurrency-with-unambiguous-choice</link>
		<comments>http://conal.net/blog/posts/functional-concurrency-with-unambiguous-choice#comments</comments>
		<pubDate>Sat, 22 Nov 2008 04:15:36 +0000</pubDate>
		<dc:creator><![CDATA[Conal]]></dc:creator>
				<category><![CDATA[Functional programming]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[unamb]]></category>

		<guid isPermaLink="false">http://conal.net/blog/?p=63</guid>
		<description><![CDATA[The Reactive library implements functional reactive programming (FRP) in a data-driven and yet purely functional way, on top of a new primitive I call &#8220;unambiguous choice&#8221;, or unamb. This primitive has simple functional semantics and a concurrent implementation. The point is to allow one to try out two different ways to answer the same question, [&#8230;]]]></description>
				<content:encoded><![CDATA[<!-- 

Title: Functional concurrency with unambiguous choice

Tags: unamb, library, concurrency

URL: http://conal.net/blog/posts/functional-concurrency-with-unambiguous-choice.md/

-->

<!-- references -->

<!-- teaser -->

<p>The <a href="http://haskell.org/haskellwiki/Reactive" title="wiki page for the Reactive library">Reactive</a> library implements functional reactive programming (FRP) in a  data-driven and yet purely functional way, on top of a new primitive I call &#8220;unambiguous choice&#8221;, or <code>unamb</code>.
This primitive has simple functional semantics and a concurrent implementation.
The point is to allow one to try out two different ways to answer the same question, when it&#8217;s not known in advance which one will succeed first, if at all.</p>

<p>This post describes and demonstrates <code>unamb</code> and its implementation.</p>

<!--
**Edits**:

* 2008-02-09: just fiddling around

-->

<!-- without a comment or something here, the last item above becomes a paragraph -->

<p><span id="more-63"></span></p>

<h3>What&#8217;s <code>unamb</code>?</h3>

<p>The value of <code>a `unamb` b</code> is the more defined of the values <code>a</code> and <code>b</code>.
The operation is subject to a semantic precondition, which is that <code>a</code> and <code>b</code> must be equal unless one or both is bottom.
It&#8217;s this precondition that distinguishes <code>unamb</code> from the ambiguous (nondeterministic) choice operator <code>amb</code>.</p>

<p>This precondition <em>also</em> distinguishes <code>unamb</code> from least upper (information) bound (&#8220;lub&#8221;).
The two operators agree where both are defined, but <em>lub</em> is much more widely defined than <code>unamb</code> is.
For instance, consider the pairs (1,⊥) and (⊥,2).
The first pair has information only about its first element, while the second pair has information only about its second element.
Their lub is (1,2).
The triples (1,⊥,3) and (⊥,2,3) are also consistent and have a lub, namely (1,2,3).</p>

<p>Each of these two examples, however, violates <code>unamb</code>&#8216;s precondition, because in each case the values are unequal and not ⊥.</p>

<p>In the examples below, I&#8217;ll use &#8220;⊥&#8221; in place of &#8220;<code>undefined</code>&#8220;, for brevity.</p>

<h3>Parallel <em>or</em></h3>

<p>In spite of its limitation, <code>unamb</code> can do some pretty fun stuff.
For instance, it&#8217;s easy to implement the famous &#8220;parallel or&#8221; operator, which yields true if either argument is true, <em>even if</em> one argument is ⊥.</p>

<pre><code>por :: Bool -&gt; Bool -&gt; Bool
a `por` b = (a || b) `unamb` (b || a)
</code></pre>

<p>This use of <code>unamb</code> satisfies the precondition, because <code>(||)</code> is &#8220;nearly commutative&#8221;, i.e., commutative except when one ordering yields ⊥.</p>

<p>This game is useful with any nearly commutative operation that doesn&#8217;t always require evaluating both arguments.
The general pattern:</p>

<pre><code>parCommute :: (a -&gt; a -&gt; b) -&gt; (a -&gt; a -&gt; b)
parCommute op x y = (x `op` y) `unamb` (y `op` x)
</code></pre>

<p>which can be specialized to parallel <em>or</em> and parallel <em>and</em>:</p>

<pre><code>por :: Bool -&gt; Bool -&gt; Bool
por = parCommute (||)

pand :: Bool -&gt; Bool -&gt; Bool
pand = parCommute (&amp;&amp;)
</code></pre>

<p>Let&#8217;s see if <code>por</code> does the job.
First, here&#8217;s sequential or:</p>

<pre><code>*Data.Unamb&gt; True || ⊥
True

*Data.Unamb&gt; ⊥ || True
*** Exception: Prelude.undefined
</code></pre>

<p>Now parallel or:</p>

<pre><code>*Data.Unamb&gt; True `por` ⊥
True

*Data.Unamb&gt; ⊥ `por` True
True
</code></pre>

<h3>Short-circuiting multiplication</h3>

<p>Another example is multiplication optimized for either argument being zero where the other might be expensive.
Just for fun, we&#8217;ll optimize for an argument of one as well.</p>

<pre><code>ptimes :: (Num a) =&gt; a -&gt; a -&gt; a
ptimes = parCommute times
 where
   0 `times` _ = 0
   1 `times` b = b
   a `times` b = a*b
</code></pre>

<p>There&#8217;s an important caveat: the type <code>a</code> must be flat.
Otherwise, the precondition of <code>unamb</code> might not hold.
While many <code>Num</code> types are flat, non-flat <code>Num</code> types are also useful, e.g., <a href="/blog/tag/derivatives/">derivative towers</a> and functions (and indeed, any <a href="/blog/tag/applicative-functor/">applicative functor</a>).</p>

<p>Testing:</p>

<pre><code>*Data.Lub&gt; 0 * ⊥
*** Exception: Prelude.undefined
*Data.Lub&gt; ⊥ * 0
*** Exception: Prelude.undefined
*Data.Lub&gt; ⊥ `ptimes` 0
0
*Data.Lub&gt; 0 `ptimes` ⊥
0
</code></pre>

<h3>Implementation</h3>

<p>Let&#8217;s assume we had <em>ambiguous</em> choice</p>

<pre><code>amb :: a -&gt; a -&gt; IO a
</code></pre>

<p>which applies to any two values of the same type, including fully defined, unequal values.
Ambiguous choice nondeterministically chooses one or the other of the values, at its own whim, and may yield different results for the same pair of inputs.</p>

<p>Note that the result of <code>amb</code> is in <code>IO</code> because of its impure semantics.
The resulting IO action might produce either argument, but it will only produce bottom if both arguments are bottom.</p>

<p>Given <code>amb</code>, unambiguous choice is easy to implement:</p>

<pre><code>unamb :: a -&gt; a -&gt; a
a `unamb` b = unsafePerformIO (a `amb` b)
</code></pre>

<p>The <code>unsafePerformIO</code> is actually safe in this situation because <code>amb</code> is deterministic when the precondition of <code>unamb</code> satisfied.</p>

<p>The implementation of <code>amb</code> simply evaluates both arguments in parallel and returns whichever one finishes (reduces to weak head normal form) first.
The racing happens via a function <code>race</code>, which works on actions:</p>

<pre><code>race :: IO a -&gt; IO a -&gt; IO a

amb :: a -&gt; a -&gt; IO a
a `amb` b = evaluate a `race` evaluate b
</code></pre>

<p>(The actual definitions of <code>unamb</code> and <code>amb</code> are a bit prettier, for point-free fetishists.)</p>

<p>The <code>race</code> function uses some Concurrent Haskell primitives.
For each action, <code>race</code> forks a thread that executes a given action and writes the result into a shared mvar.
It then waits for the mvar to get written, and then halts the threads.</p>

<pre><code>a `race` b = do v  &lt;- newEmptyMVar
                ta &lt;- forkPut a v
                tb &lt;- forkPut b v
                x  &lt;- takeMVar  v
                killThread ta
                killThread tb
                return x

forkPut :: IO a -&gt; MVar a -&gt; IO ThreadId
forkPut act v = forkIO (act &gt;&gt;= putMVar v)  -- naive version
</code></pre>

<p>This implementation of <code>forkPut</code> is a little too simplisitic.
In Haskell, <code>⊥</code> doesn&#8217;t simply block forever; it raises an exception.
That specific exception must be caught and neutralized.</p>

<pre><code>forkPut act v = forkIO ((act &gt;&gt;= putMVar v) `catch` uhandler)
 where
   uhandler (ErrorCall "Prelude.undefined") = return ()
   uhandler err                             = throw err
</code></pre>

<p>Now when <code>act</code> evaluates <code>⊥</code>, the exception is raised, the <code>putMVar</code> is bypassed, and then the exception is silenced.
The result is that the mvar does not get written, so the other thread in <code>race</code> must win.</p>

<p>But, oops &#8212; what if the other thread also evaluates <code>⊥</code> and skips writing the mvar also?
In that case, the main thread of <code>race</code> (which might be spun by another <code>race</code>) will block forever, waiting on an mvar that has no writer.
This behavior would actually be just fine, since bottom is the correct answer.
However, the GHC run-time system won&#8217;t stand for it, and cleverly raises an <code>BlockedOnDeadMVar</code> exception.
For this reason, <code>forkPut</code> must neutralize a second exception via a second handler:</p>

<pre><code>forkPut act v = forkIO ((act &gt;&gt;= putMVar v)
                        `catch` uhandler `catch` bhandler)
 where
   uhandler (ErrorCall "Prelude.undefined") = return ()
   uhandler err                             = throw err
   bhandler BlockedOnDeadMVar               = return ()
</code></pre>

<h3>What&#8217;s next?</h3>

<p>You can learn more about <code>unamb</code> on the <a href="http://haskell.org/haskellwiki/unamb">unamb wiki page</a> (where you&#8217;ll find links to the code) and in the paper <em><a href="http://conal.net/papers/simply-reactive" title="Paper: &quot;Simply efficient functional reactivity&quot;">Simply efficient functional reactivity</a></em>.</p>

<p>My next post will show how to relax the stringent precondition on <code>unamb</code> into something more like the full least-upper-bound operation.
This generalization supports richly structured (non-flat) types.</p>
<p><a href="http://conal.net/blog/?flattrss_redirect&amp;id=63&amp;md5=3cc9ae81f7ebdb63398eabb34e9476c0"><img src="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png" srcset="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@2x.png 2xhttp://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@3x.png 3x" alt="Flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://conal.net/blog/posts/functional-concurrency-with-unambiguous-choice/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=conal&amp;popout=1&amp;url=http%3A%2F%2Fconal.net%2Fblog%2Fposts%2Ffunctional-concurrency-with-unambiguous-choice&amp;language=en_GB&amp;category=text&amp;title=Functional+concurrency+with+unambiguous+choice&amp;description=The+Reactive+library+implements+functional+reactive+programming+%28FRP%29+in+a+data-driven+and+yet+purely+functional+way%2C+on+top+of+a+new+primitive+I+call+%26%238220%3Bunambiguous+choice%26%238221%3B%2C+or+unamb.+This+primitive...&amp;tags=library%2Cunamb%2Cblog" type="text/html" />
	</item>
		<item>
		<title>&#8220;Tangible Functional Programming&#8221; &#8212; icfp version</title>
		<link>http://conal.net/blog/posts/tangible-functional-programming-icfp-version</link>
		<comments>http://conal.net/blog/posts/tangible-functional-programming-icfp-version#comments</comments>
		<pubDate>Tue, 10 Jul 2007 05:19:00 +0000</pubDate>
		<dc:creator><![CDATA[Conal]]></dc:creator>
				<category><![CDATA[Functional programming]]></category>
		<category><![CDATA[arrow]]></category>
		<category><![CDATA[DeepArrow]]></category>
		<category><![CDATA[Eros]]></category>
		<category><![CDATA[gestural composition]]></category>
		<category><![CDATA[icfp]]></category>
		<category><![CDATA[interactive programming]]></category>
		<category><![CDATA[interactive visualization]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[Phooey]]></category>
		<category><![CDATA[TV]]></category>
		<category><![CDATA[writing]]></category>

		<guid isPermaLink="false">http://conal.net/blog/posts/tangible-functional-programming-icfp-version/</guid>
		<description><![CDATA[I just submitted the camera-ready version of &#8220;Tangible Functional Programming&#8221;, for ICFP &#8217;07. I&#8217;m happy with this version. It&#8217;s improved drastically since my first submission to ICFP &#8217;06, thanks to many helpful comments. I&#8217;ve also been recreating the implementation on top of DeepArrow, Phooey, and TV, in preparation for a software release. It&#8217;s getting simpler, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I just submitted the camera-ready version of <a href="http://conal.net/papers/Eros">&#8220;Tangible Functional Programming&#8221;</a>, for <a href="http://www.informatik.uni-bonn.de/%7Eralf/icfp07.html">ICFP &#8217;07</a>.  I&#8217;m happy with this version. It&#8217;s improved drastically since my first submission to ICFP &#8217;06, thanks to many helpful comments. I&#8217;ve also been recreating the implementation on top of <a href="http://www.haskell.org/haskellwiki/DeepArrow">DeepArrow</a>, <a href="http://www.haskell.org/haskellwiki/Phooey">Phooey</a>, and <a href="http://www.haskell.org/haskellwiki/TV">TV</a>, in preparation for a software release. It&#8217;s getting simpler, but it&#8217;s not as simple as I want.</p>
<p><a href="http://conal.net/blog/?flattrss_redirect&amp;id=37&amp;md5=9870e5dd6003b96b97a04f322c179426"><img src="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png" srcset="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@2x.png 2xhttp://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@3x.png 3x" alt="Flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://conal.net/blog/posts/tangible-functional-programming-icfp-version/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=conal&amp;popout=1&amp;url=http%3A%2F%2Fconal.net%2Fblog%2Fposts%2Ftangible-functional-programming-icfp-version&amp;language=en_GB&amp;category=text&amp;title=%26%238220%3BTangible+Functional+Programming%26%238221%3B+%26%238212%3B+icfp+version&amp;description=I+just+submitted+the+camera-ready+version+of+%26%238220%3BTangible+Functional+Programming%26%238221%3B%2C+for+ICFP+%26%238217%3B07.+I%26%238217%3Bm+happy+with+this+version.+It%26%238217%3Bs+improved+drastically+since+my+first+submission+to+ICFP+%26%238217%3B06%2C+thanks+to...&amp;tags=arrow%2CDeepArrow%2CEros%2Cgestural+composition%2Cicfp%2Cinteractive+programming%2Cinteractive+visualization%2Clibrary%2CPhooey%2CTV%2Cwriting%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Implementing a type for partial values</title>
		<link>http://conal.net/blog/posts/implementing-a-type-for-partial-values</link>
		<comments>http://conal.net/blog/posts/implementing-a-type-for-partial-values#comments</comments>
		<pubDate>Mon, 02 Jul 2007 01:17:00 +0000</pubDate>
		<dc:creator><![CDATA[Conal]]></dc:creator>
				<category><![CDATA[Functional programming]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[partial value]]></category>
		<category><![CDATA[solution]]></category>

		<guid isPermaLink="false">http://conal.net/blog/posts/implementing-a-type-for-partial-values/</guid>
		<description><![CDATA[In my previous post, I gave an interface for a type of partial values and invited implementations. Here&#8217;s mine, which surprised me in its simplicity. The trick is to represent Partial a as a -&#62; a, i.e., a way to selectively replace parts of a value. Typically the replaced parts are bottom/undefined. I want Partial [&#8230;]]]></description>
				<content:encoded><![CDATA[<!-- 

Title: Implementing a type for partial values

Tags: library, partial value, solution 

URL: http://conal.net/blog/posts/implementing-a-type-for-partial-values/

-->

<!-- references -->

<!-- teaser -->

<p>In my <a href="http://conal.net/blog/posts/a-type-for-partial-values/" title="Blog post: &quot;A type for partial values&quot;">previous post</a>, I gave an interface for a type of <em>partial values</em> and invited implementations. Here&#8217;s mine, which surprised me in its simplicity.</p>

<!--
**Edits**:

* 2008-02-09: just fiddling around
-->

<!-- without a comment or something here, the last item above becomes a paragraph -->

<p><span id="more-36"></span></p>

<p>The trick is to represent <code>Partial a</code> as <code>a -&gt; a</code>, i.e., a way to selectively replace parts of a value. Typically the replaced parts are bottom/undefined. I want <code>Partial a</code> to be a monoid, and <code>Data.Monoid</code> provides an instance:</p>

<pre><code>-- | The monoid of endomorphisms under composition.
newtype Endo a = Endo { appEndo :: a -&gt; a }

instance Monoid (Endo a) where
  mempty = Endo id
  Endo f `mappend` Endo g = Endo (f . g)
</code></pre>

<p>So my definition is simply a synonym:</p>

<pre><code>type Partial = Endo
</code></pre>

<p>Note that <code>mempty</code> and <code>mappend</code> do exactly what I want. <code>mempty</code> adds no information at all, while <code>u `mappend` v</code> adds (overrides) information with <code>u</code> and then with <code>v</code>.</p>

<p>The implementation of functions on <code>Partial</code> is trivial.</p>

<pre><code>inPartial :: ((a-&gt;a) -&gt; (a'-&gt;a')) -&gt; (Partial a -&gt; Partial a')
inPartial f = Endo . f . appEndo

valp :: c -&gt; Partial c
valp c = Endo (const c)

pval :: Partial c -&gt; c
pval (Endo f) = f undefined
unFst :: Partial a -&gt; Partial (a,b)
unFst = inPartial first

unSnd :: Partial b -&gt; Partial (a,b)
unSnd = inPartial second

unElt :: Functor f =&gt; Partial a -&gt; Partial (f a)
unElt = inPartial fmap
</code></pre>

<p>I&#8217;m not sure I&#8217;ll end up using the <code>Partial</code> type in Eros, but I like having it around.   If you think of variations, extensions and/or other uses, please let me know.</p>
<p><a href="http://conal.net/blog/?flattrss_redirect&amp;id=36&amp;md5=7a0d8fdfaf3d3af9ca985274869c2b27"><img src="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png" srcset="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@2x.png 2xhttp://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@3x.png 3x" alt="Flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://conal.net/blog/posts/implementing-a-type-for-partial-values/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=conal&amp;popout=1&amp;url=http%3A%2F%2Fconal.net%2Fblog%2Fposts%2Fimplementing-a-type-for-partial-values&amp;language=en_GB&amp;category=text&amp;title=Implementing+a+type+for+partial+values&amp;description=In+my+previous+post%2C+I+gave+an+interface+for+a+type+of+partial+values+and+invited+implementations.+Here%26%238217%3Bs+mine%2C+which+surprised+me+in+its+simplicity.+The+trick+is+to+represent...&amp;tags=library%2Cpartial+value%2Csolution%2Cblog" type="text/html" />
	</item>
		<item>
		<title>A type for partial values</title>
		<link>http://conal.net/blog/posts/a-type-for-partial-values</link>
		<comments>http://conal.net/blog/posts/a-type-for-partial-values#comments</comments>
		<pubDate>Mon, 02 Jul 2007 00:47:00 +0000</pubDate>
		<dc:creator><![CDATA[Conal]]></dc:creator>
				<category><![CDATA[Functional programming]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[monoid]]></category>
		<category><![CDATA[partial value]]></category>

		<guid isPermaLink="false">http://conal.net/blog/posts/a-type-for-partial-values/</guid>
		<description><![CDATA[In simplifying my Eros 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. First [&#8230;]]]></description>
				<content:encoded><![CDATA[<!-- 

Title: A type for partial values

Tags: Functional programming, Haskell, libraries, partial values

-->

<!-- references -->

<!-- teaser -->

<p>In simplifying my <a href="http://conal.net/papers/Eros">Eros</a> 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.</p>

<!--
**Edits**:

* 2008-02-09: just fiddling around
-->

<!-- without a comment or something here, the last item above becomes a paragraph -->

<p><span id="more-35"></span></p>

<p>First the type:</p>

<pre><code>type Partial a
</code></pre>

<p>I require that <code>Partial a</code> be a monoid, for which <code>mempty</code> is the completely undefined value, and in <code>u `mappend` v</code>, <code>v</code> selectively replaces parts of <code>u</code>. (Lattice-wise, <code>mempty</code> is bottom, and <code>mappend</code> is not quite <code>lub</code>, as it lacks commutativity).</p>

<p>Now the programming interface:</p>

<pre><code>-- Treat a full value as a partial one.  Fully overrides any "previous" (earlier
-- argument to mappend) partial value.
valp :: c -&gt; Partial c

-- Force a partial value into a full one, filling in bottom for any missing parts.
pval :: Partial c -&gt; c

-- Inverse to fst, on partial values.  Inject info into the the first half of a pair,
-- and leave the second half alone.
unFst :: Partial a -&gt; Partial (a,b)

-- Inverse to snd.
unSnd :: Partial b -&gt; Partial (a,b)

-- Inverse to "element" access, on all elements.  A way to inject some info about every
-- element.  For f, consider [], (-&gt;) a, Event, etc.
unElt :: Functor f =&gt; Partial a -&gt; Partial (f a)
</code></pre>

<p>That&#8217;s it. I&#8217;d love to hear ideas for representing Partial a and implementing the functions above. In the next post, I&#8217;ll give mine.</p>
<p><a href="http://conal.net/blog/?flattrss_redirect&amp;id=35&amp;md5=a93de6463362fec70d46d91900a24afa"><img src="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png" srcset="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@2x.png 2xhttp://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@3x.png 3x" alt="Flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://conal.net/blog/posts/a-type-for-partial-values/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=conal&amp;popout=1&amp;url=http%3A%2F%2Fconal.net%2Fblog%2Fposts%2Fa-type-for-partial-values&amp;language=en_GB&amp;category=text&amp;title=A+type+for+partial+values&amp;description=In+simplifying+my+Eros+implementation%2C+I+came+across+a+use+for+a+type+that+represents+partial+information+about+values.+I+came+up+with+a+very+simple+implementation%2C+though+perhaps+not...&amp;tags=library%2Cmonoid%2Cpartial+value%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Software releases: TypeCompose, Phooey, GuiTV</title>
		<link>http://conal.net/blog/posts/software-releases-typecompose-phooey-guitv</link>
		<comments>http://conal.net/blog/posts/software-releases-typecompose-phooey-guitv#comments</comments>
		<pubDate>Fri, 30 Mar 2007 20:17:00 +0000</pubDate>
		<dc:creator><![CDATA[Conal]]></dc:creator>
				<category><![CDATA[Functional programming]]></category>
		<category><![CDATA[GuiTV]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[Phooey]]></category>
		<category><![CDATA[TV]]></category>
		<category><![CDATA[type composition]]></category>

		<guid isPermaLink="false">http://conal.net/blog/posts/software-releases-typecompose-phooey-guitv/</guid>
		<description><![CDATA[Three related software releases. I am very interested in comments and contributions. TypeCompose provides some classes &#38; 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 Phooey. Phooey is a library for functional user interfaces. Highlights in this 0.3 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Three related software releases.  I am very interested in comments and contributions.</p>

<p><a href="http://haskell.org/haskellwiki/TypeCompose" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">TypeCompose</a> 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 <a href="http://haskell.org/haskellwiki/Phooey" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">Phooey</a>.
<span class="sg">
</span><a href="http://haskell.org/haskellwiki/Phooey" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">Phooey</a> is a library for functional user interfaces.  Highlights in this 0.3 release:</p>

<ul><li> Uses new <a href="http://haskell.org/haskellwiki/TypeCompose" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"> TypeCompose</a> package, which includes a simple implementation of data-driven computation.</li><li> New Applicative functor interface.</li><li> Eliminated the catch-all Phooey.hs module.  Now import any one of Graphics.UI.Phooey.{Monad ,Applicative,Arrow}.</li><li> Phooey.Monad has two different styles of output widgets, made by owidget and owidget&#8217;. The latter is used to implement Phooey.Applicative.</li><li> Self- and mutually-recursive widgets now work again in Phooey.Monad. They wedge in Phooey.Arrow and Phooey.Applicative.</li></ul>

<p>Phooey is also used in <a href="http://haskell.org/haskellwiki/GuiTV" title="GuiTV" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"> GuiTV</a>, a library for composable interfaces and &#8220;tangible values&#8221;.  I&#8217;ve also just updated GuiTV to 0.3, to sync with Phooey 1.0.
<span class="sg">
</span></p>
<p><a href="http://conal.net/blog/?flattrss_redirect&amp;id=33&amp;md5=a7538172707138bbf7b228cdff2474dd"><img src="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png" srcset="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@2x.png 2xhttp://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@3x.png 3x" alt="Flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://conal.net/blog/posts/software-releases-typecompose-phooey-guitv/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=conal&amp;popout=1&amp;url=http%3A%2F%2Fconal.net%2Fblog%2Fposts%2Fsoftware-releases-typecompose-phooey-guitv&amp;language=en_GB&amp;category=text&amp;title=Software+releases%3A+TypeCompose%2C+Phooey%2C+GuiTV&amp;description=Three+related+software+releases.+I+am+very+interested+in+comments+and+contributions.+TypeCompose+provides+some+classes+%26amp%3B+instances+for+forms+of+type+composition.+It+also+includes+a+very+simple+implementation...&amp;tags=GuiTV%2Clibrary%2CPhooey%2CTV%2Ctype+composition%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Software releases</title>
		<link>http://conal.net/blog/posts/software-releases</link>
		<comments>http://conal.net/blog/posts/software-releases#comments</comments>
		<pubDate>Tue, 23 Jan 2007 06:09:00 +0000</pubDate>
		<dc:creator><![CDATA[Conal]]></dc:creator>
				<category><![CDATA[Functional programming]]></category>
		<category><![CDATA[DeepArrow]]></category>
		<category><![CDATA[Eros]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[Phooey]]></category>
		<category><![CDATA[TV]]></category>

		<guid isPermaLink="false">http://conal.net/blog/posts/software-releases/</guid>
		<description><![CDATA[Last week I released three Haskell libraries: DeepArrow 0.0, Phooey 0.1, and TV 0.0. These libraries came from Eros, which aims at creating a right-brain-friendly (concrete, non-linguistic) &#8220;programming&#8221; process. I&#8217;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&#8217;d been [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Last week I released three Haskell libraries: <a href="http://haskell.org/haskellwiki/DeepArrow">DeepArrow</a> 0.0, <a href="http://haskell.org/haskellwiki/Phooey">Phooey</a> 0.1, and <a href="http://haskell.org/haskellwiki/TV">TV</a> 0.0.</p>

<p>These libraries came from <a href="http://conal.net/papers/Eros">Eros</a>, which aims at creating a right-brain-friendly (concrete, non-linguistic) &#8220;programming&#8221; process. I&#8217;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&#8217;d been wondering how to map a user&#8217;s gestures into operations on a functional program. Lots of noodling led to ideas of composable interfaces and &#8220;tangible values&#8221; (term thanks to Sean Seefried) and gestural composition in Eros.</p>

<p>Eros is more complicated than I like, so I started splitting it into pieces:</p>

<ul><li> <a href="http://haskell.org/haskellwiki/Phooey">Phooey</a> is a functional GUI library that has much of Eros&#8217;s GUI implementation techniques, but much more carefully structured than in the Eros paper.
</li><li> <a href="http://haskell.org/haskellwiki/DeepArrow">DeepArrow</a> has the general notion of &#8220;deep application&#8221;
</li><li> <a href="http://haskell.org/haskellwiki/TV">TV</a> has the algebra of <i>composable interfaces</i>, or visualizations of pure values, and it has <i>tangible values</i>, which are separable combinations of interface and value.  It uses Phooey to generate GUIs very simply from interfaces</li></ul>

<p>Although these libraries came from Eros, I&#8217;d like to see other applications as well.</p>

<p>Where am I going with library development?</p>

<ul><li> Figure out how to support simple GUIs and Eros&#8217;s <em>gesturally composable</em> GUIs, without code/library replication.
</li><li> Re-implement Eros on top of simpler pieces.</li><li> Refactor <a href="http://conal.net/Pajama">Pajama</a> into reusable libraries and release.
<ul><li>Building and optimizing &#8220;expressions&#8221;
</li><li>Common sub-expression elimination
</li><li>Generation of Java code</li><li>Perhaps other back-ends besides Java</li><li>Pajama, on top of these pieces</li></ul></li></ul>

<p><span style="font-weight: bold;">Edit of March 5, 2007</span>:  TV is now split into a core <a dragover="true" href="http://haskell.org/haskellwiki/TV">TV</a> package, with no GUI functionality, and <a href="http://haskell.org/haskellwiki/GuiTV">GuiTV,</a> with Phooey-based GUI creation.  The reason for the split is that <a href="http://haskell.org/haskellwiki/Phooey">Phooey</a> depends on <a href="http://wxhaskell.sourceforge.net/">wxHaskell</a>, which can be difficult to install.</p>
<p><a href="http://conal.net/blog/?flattrss_redirect&amp;id=30&amp;md5=19448e0a9bb58b65046a865b3fdde307"><img src="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png" srcset="http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@2x.png 2xhttp://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white.png, http://conal.net/blog/wp-content/plugins/flattr/img/flattr-badge-white@3x.png 3x" alt="Flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://conal.net/blog/posts/software-releases/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" title="Flattr this!" href="https://flattr.com/submit/auto?user_id=conal&amp;popout=1&amp;url=http%3A%2F%2Fconal.net%2Fblog%2Fposts%2Fsoftware-releases&amp;language=en_GB&amp;category=text&amp;title=Software+releases&amp;description=Last+week+I+released+three+Haskell+libraries%3A+DeepArrow+0.0%2C+Phooey+0.1%2C+and+TV+0.0.+These+libraries+came+from+Eros%2C+which+aims+at+creating+a+right-brain-friendly+%28concrete%2C+non-linguistic%29+%26%238220%3Bprogramming%26%238221%3B+process.+I%26%238217%3Bve...&amp;tags=DeepArrow%2CEros%2Clibrary%2CPhooey%2CTV%2Cblog" type="text/html" />
	</item>
	</channel>
</rss>
