<?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; implementation</title>
	<atom:link href="http://conal.net/blog/tag/implementation/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>Simply efficient functional reactivity</title>
		<link>http://conal.net/blog/posts/simply-efficient-functional-reactivity</link>
		<comments>http://conal.net/blog/posts/simply-efficient-functional-reactivity#comments</comments>
		<pubDate>Fri, 04 Apr 2008 22:27:43 +0000</pubDate>
		<dc:creator><![CDATA[Conal]]></dc:creator>
				<category><![CDATA[Functional programming]]></category>
		<category><![CDATA[applicative functor]]></category>
		<category><![CDATA[continuous]]></category>
		<category><![CDATA[discrete]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[FRP]]></category>
		<category><![CDATA[functional reactive programming]]></category>
		<category><![CDATA[functor]]></category>
		<category><![CDATA[future value]]></category>
		<category><![CDATA[icfp]]></category>
		<category><![CDATA[implementation]]></category>
		<category><![CDATA[joinMaybes]]></category>
		<category><![CDATA[monad]]></category>
		<category><![CDATA[monoid]]></category>
		<category><![CDATA[multi-threading]]></category>
		<category><![CDATA[normal form]]></category>
		<category><![CDATA[paper]]></category>
		<category><![CDATA[reactive behavior]]></category>
		<category><![CDATA[reactive value]]></category>
		<category><![CDATA[semantics]]></category>
		<category><![CDATA[time]]></category>
		<category><![CDATA[type class]]></category>
		<category><![CDATA[type class morphism]]></category>
		<category><![CDATA[type composition]]></category>

		<guid isPermaLink="false">http://conal.net/blog/posts/simply-efficient-functional-reactivity/</guid>
		<description><![CDATA[I submitted a paper Simply efficient functional reactivity to ICFP 2008. Abstract: Functional reactive programming (FRP) has simple and powerful semantics, but has resisted efficient implementation. In particular, most past implementations have used demand-driven sampling, which accommodates FRP&#8217;s continuous time semantics and fits well with the nature of functional programming. Consequently, values are wastefully recomputed [&#8230;]]]></description>
				<content:encoded><![CDATA[<!-- 

Title: Simply efficient functional reactivity

Tags: applicative functor, continuous, discrete, event, FRP, functional reactive programming, functor, future value, icfp, implementation, joinMaybes, monad, monoid, type class morphism, multi-threading, normal form, paper, reactive behavior, reactive value, semantics, time, type class, type composition

URL: http://conal.net/blog/posts/simply-efficient-functional-reactivity/

-->

<!-- references -->

<!-- teaser -->

<p>I submitted a paper <em><a href="http://conal.net/papers/simply-reactive" title="Paper: &quot;Simply efficient functional reactivity&quot;">Simply efficient functional reactivity</a></em> to <a href="http://www.icfpconference.org/icfp2008" title="ICFP 2008 conference page">ICFP 2008</a>.</p>

<p><strong>Abstract:</strong></p>

<blockquote>
  <p>Functional reactive programming (FRP) has simple and powerful semantics, but has resisted efficient implementation.  In particular, most past implementations have used demand-driven sampling, which accommodates FRP&#8217;s continuous time semantics and fits well with the nature of functional programming.  Consequently, values are wastefully recomputed even when inputs don&#8217;t change, and reaction latency can be as high as the sampling period.</p>
  
  <p>This paper presents a way to implement FRP that combines data- and demand-driven evaluation, in which values are recomputed only when necessary, and reactions are nearly instantaneous.  The implementation is rooted in a new simple formulation of FRP and its semantics and so is easy to understand and reason about.</p>
  
  <p>On the road to efficiency and simplicity, we&#8217;ll meet some old friends (monoids, functors, applicative functors, monads, morphisms, and improving values) and make some new friends (functional future values, reactive normal form, and concurrent &#8220;unambiguous choice&#8221;).</p>
</blockquote>

<!--
**Edits**:

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

<!-- without a comment or something here, the last item above becomes a paragraph -->
<p><a href="http://conal.net/blog/?flattrss_redirect&amp;id=22&amp;md5=dee648d38383131c59963d5b9b4c4b93"><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/simply-efficient-functional-reactivity/feed</wfw:commentRss>
		<slash:comments>33</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%2Fsimply-efficient-functional-reactivity&amp;language=en_GB&amp;category=text&amp;title=Simply+efficient+functional+reactivity&amp;description=I+submitted+a+paper+Simply+efficient+functional+reactivity+to+ICFP+2008.+Abstract%3A+Functional+reactive+programming+%28FRP%29+has+simple+and+powerful+semantics%2C+but+has+resisted+efficient+implementation.+In+particular%2C+most+past...&amp;tags=applicative+functor%2Ccontinuous%2Cdiscrete%2Cevents%2CFRP%2Cfunctional+reactive+programming%2Cfunctor%2Cfuture+value%2Cicfp%2Cimplementation%2CjoinMaybes%2Cmonad%2Cmonoid%2Cmulti-threading%2Cnormal+form%2Cpaper%2Creactive+behavior%2Creactive+value%2Csemantics%2Ctime%2Ctype+class%2Ctype+class+morphism%2Ctype+composition%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Future values via multi-threading</title>
		<link>http://conal.net/blog/posts/future-values-via-multi-threading</link>
		<comments>http://conal.net/blog/posts/future-values-via-multi-threading#comments</comments>
		<pubDate>Wed, 16 Jan 2008 05:15:35 +0000</pubDate>
		<dc:creator><![CDATA[Conal]]></dc:creator>
				<category><![CDATA[Functional programming]]></category>
		<category><![CDATA[applicative functor]]></category>
		<category><![CDATA[functor]]></category>
		<category><![CDATA[future value]]></category>
		<category><![CDATA[implementation]]></category>
		<category><![CDATA[monad]]></category>
		<category><![CDATA[monoid]]></category>
		<category><![CDATA[multi-threading]]></category>

		<guid isPermaLink="false">http://conal.net/blog/posts/future-values-part-two-a-multi-threaded-implementation/</guid>
		<description><![CDATA[Future values A previous post described future values (or simply &#8220;futures&#8221;), which are values depend on information from the future, e.g., from the real world. There I gave a simple denotational semantics for future values as time/value pairs. This post describes the multi-threaded implementation of futures in Reactive&#8216;s Data.Reactive module. A simple representation Futures are [&#8230;]]]></description>
				<content:encoded><![CDATA[<!-- 

Title Future values via multi-threading

Tags: future values, multi-threading, implementation, functors, applicative functors, monads, monoids

-->

<!-- References -->

<h2>Future values</h2>

<p>A <a href="http://conal.net/blog/posts/future-values/" title="Blog post: &quot;Future values&quot;">previous post</a> described future values (or simply &#8220;futures&#8221;), which are values depend on information from the future, e.g., from the real world. There I gave a simple denotational semantics for future values as time/value pairs.  This post describes the multi-threaded implementation of futures in <a href="http://haskell.org/haskellwiki/Reactive" title="Wiki page for the Reactive library">Reactive</a>&#8216;s <code>Data.Reactive</code> module.</p>

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

<h2>A simple representation</h2>

<p>Futures are represented as actions that deliver a value.  These actions are required to yield the same answer every time.   Having a special representation for the future that never arrives (<code>mempty</code>) will allow for some very important optimizations later.</p>

<pre><code>data Future a = Future (IO a) | Never
</code></pre>

<p>A value can be &#8220;forced&#8221; from a future.  If the value isn&#8217;t yet available, forcing will block.</p>

<pre><code>force :: Future a -&gt; IO a
force (Future io) = io
force Never       = hang  -- block forever
</code></pre>

<h2>Threads and synchronization</h2>

<p>The current implementation of futures uses <a href="http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Concurrent.html">Concurrent Haskell</a>&#8216;s <code>forkIO</code>
(fork a thread) and <code>MVar</code>s (synchronized communication variables).</p>

<p>Except for trivial futures (<code>pure</code>/<code>return</code> and <code>mempty</code>), the action in a future will simply be reading an MVar.  Internal to the implementation:</p>

<pre><code>newFuture :: IO (Future a, a -&gt; IO ())
newFuture = do v &lt;- newEmptyMVar
               return (Future (readMVar v), putMVar v)
</code></pre>

<p>The MVar is written to as the final step of a forked thread.  Importantly, it is to be written only once.  (It&#8217;s really an IVar.)</p>

<pre><code>future :: IO a -&gt; Future a
future mka = unsafePerformIO $
             do (fut,sink) &lt;- newFuture
                forkIO $ mka &gt;&gt;= sink
                return fut
</code></pre>

<p>Note that the actual value is computed just once, and is accessed cheaply.</p>

<h2>Functor, Applicative, and Monad</h2>

<p>The <code>Functor</code>, <code>Applicative</code>, and <code>Monad</code> instances are defined easily in terms of <code>future</code> and the corresponding instances for <code>IO</code>:</p>

<pre><code>instance Functor Future where
  fmap f (Future get) = future (fmap f get)
  fmap _ Never        = Never

instance Applicative Future where
  pure a                      = Future (pure a)
  Future getf &lt;*&gt; Future getx = future (getf &lt;*&gt; getx)
  _           &lt;*&gt; _           = Never

instance Monad Future where
  return            = pure
  Future geta &gt;&gt;= h = future (geta &gt;&gt;= force . h)
  Never       &gt;&gt;= _ = Never
</code></pre>

<h2>Monoid &#8212; racing</h2>

<p>The remaining class to implement is <code>Monoid</code>.  The <code>mempty</code> method is <code>Never</code>.  The <code>mappend</code> method is to select the earlier of two futures, which is implemented by having the two futures race to extrat a value:</p>

<pre><code>instance Monoid (Future a) where
  mempty  = Never
  mappend = race

race :: Future a -&gt; Future a -&gt; Future a
</code></pre>

<p>Racing is easy in the case either is <code>Never</code>:</p>

<pre><code>Never `race` b     = b
a     `race` Never = a
</code></pre>

<p>Otherwise, spin a thread for each future.  The winner kills the loser.</p>

<pre><code>a `race` b = unsafePerformIO $
             do (c,sink) &lt;- newFuture
                let run fut tid = forkIO $ do x &lt;- force fut
                                              killThread tid
                                              sink x
                mdo ta &lt;- run a tb
                    tb &lt;- run b ta
                    return ()
                return c
</code></pre>

<h2>The problem</h2>

<p>This last piece of the implementation can fall short of the semantics.  For <code>a `mappend` b</code>, we might get <code>b</code> instead of <code>a</code> even if they&#8217;re available simultaneously.  It&#8217;s even possible to get the later of the two if they&#8217;re nearly simultaneous.</p>

<p><em>Edit (2008-02-02)</em>: although simultaneous <em>physical</em> events are extremely unlikely, futures are compositional, so it&#8217;s easy to construct two distinct but simultaneous futures in terms of on a common physical future.</p>

<p>What will it take to get deterministic semantics for <code>a `mappend` b</code>?  Here&#8217;s an idea: include an  explicit time in a future.  When one future happens with a time <code>t</code>, query whether the other one occurs by the same time.  What does it take to support this query operation?</p>

<h2>A simpler implementation</h2>

<p>In this implementation, futures (other than <code>Never</code>) hold actions that typically read an MVar that is written only once.  They could instead simply hold lazy values.</p>

<pre><code>data Future a = Future a | Never
</code></pre>

<p>Forcing a future evaluates to weak head normal form (WHNF).</p>

<pre><code>force :: Future a -&gt; IO a
force (Future a) = a `seq` return a
force Never      = hang
</code></pre>

<p>Making new future would work almost identically, just adding an <code>unsafePerformIO</code>.</p>

<pre><code>newFuture :: IO (Future a, a -&gt; IO ())
newFuture = 
  do v &lt;- newEmptyMVar
     return (Future (unsafePerformIO $ readMVar v), putMVar v)
</code></pre>

<p>The <code>Functor</code>, <code>Applicative</code>, and <code>Monad</code> instances simplify considerably, using function application directly, instead of the corresponding methods from the <code>Functor</code>, <code>Applicative</code>, and <code>Monad</code> instances of <code>IO</code>.</p>

<pre><code>instance Functor Future where
  fmap f (Future a) = Future (f a)
  fmap _ Never      = Never

instance Applicative Future where
  pure a                = Future a
  Future f &lt;*&gt; Future x = Future (f x)
  _        &lt;*&gt; _        = Never

instance Monad Future where
  return         = pure
  Future a &gt;&gt;= h = h a
  Never    &gt;&gt;= _ = Never
</code></pre>

<p>The <code>Monoid</code> instance is completely unchanged.</p>

<p>How does this implementation compare with the one above?</p>

<ul>
<li>It&#8217;s simpler, as stated.</li>
<li>It&#8217;s a bit more efficient.  Each MVar is only read once.  Also, the <code>Functor</code>, <code>Applicative</code>, and <code>Monad</code> instances no longer create threads and MVars.</li>
<li>The type statically enforces that forcing a future always gives the same result.</li>
<li>Forcing a future reduces the value to WHNF and so is probably a little less lazy than the  implementation above.</li>
</ul>

<p>I&#8217;ve tried out this implementation and found that it intermittently crashes some examples that work fine in the <code>IO</code> version.  I have no idea why, and I&#8217;d be very interested in ideas about it or anything else in this post.</p>
<p><a href="http://conal.net/blog/?flattrss_redirect&amp;id=8&amp;md5=1d95c4fec83fe61459b536348c3e2ffe"><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/future-values-via-multi-threading/feed</wfw:commentRss>
		<slash:comments>10</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%2Ffuture-values-via-multi-threading&amp;language=en_GB&amp;category=text&amp;title=Future+values+via+multi-threading&amp;description=Future+values+A+previous+post+described+future+values+%28or+simply+%26%238220%3Bfutures%26%238221%3B%29%2C+which+are+values+depend+on+information+from+the+future%2C+e.g.%2C+from+the+real+world.+There+I+gave+a+simple...&amp;tags=applicative+functor%2Cfunctor%2Cfuture+value%2Cimplementation%2Cmonad%2Cmonoid%2Cmulti-threading%2Cblog" type="text/html" />
	</item>
	</channel>
</rss>
