Hi Ryan,<div><br><div class="gmail_quote">On Fri, Jun 18, 2010 at 7:57 PM, Ryan Ingram <span dir="ltr">&lt;<a href="mailto:ryani.spam@gmail.com">ryani.spam@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Related to this, I really would like to be able to use arrow notation<br>
without &quot;arr&quot;; I was looking into writing a &quot;circuit optimizer&quot; that<br>
modified my arrow-like circuit structure, but since it&#39;s impossible to<br>
&quot;look inside&quot; arr, I ran into a brick wall.<br>
<br>
Has anyone done any analysis of what operations arrow notation<br>
actually requires so that they can be made methods of some typeclass,<br>
instead of defining everything in terms of &quot;arr&quot;?<br>
<br>
It seems to me the trickiness comes when you have patterns and complex<br>
expressions in your arrow notation, that is, you write<br>
<br>
   (a,b) &lt;- some_arrow &lt;- (c,d)<br>
   returnA -&lt; a<br></blockquote><div><br></div><div>The design I&#39;ve been using for this has been to use data-reify, and observable sharing and to use pure let bindings to build the circuit.</div><div><br></div><div>
<span class="Apple-style-span" style="font-family: monospace; font-size: 11px; line-height: 11px; white-space: pre; ">  full_adder :: Bit -&gt; Bit -&gt; Bit -&gt; (Bit, Bit)
  full_adder a b cin = (s2, c1 || c2)
      where (s1,c1) = half_adder a b
            (s2,c2) = half_adder s1 cin

  half_adder :: Bit -&gt; Bit -&gt; (Bit, Bit)
  half_adder a b = (a `xor` b, a &amp;&amp; b)</span></div><div><span class="Apple-style-span" style="font-family: monospace; font-size: 11px; line-height: 11px; white-space: pre; "><br></span></div><div><span class="Apple-style-span" style="font-family: monospace; font-size: 11px; line-height: 11px; white-space: pre; ">  foo = do</span></div>
<div><span class="Apple-style-span" style="font-family: monospace; font-size: 11px; line-height: 11px; white-space: pre; ">      x &lt;- exists</span></div><div><span class="Apple-style-span" style="font-family: monospace; font-size: 11px; line-height: 11px; white-space: pre; ">      y &lt;- exists</span></div>
<div><span class="Apple-style-span" style="font-family: monospace; font-size: 11px; line-height: 11px; white-space: pre; ">      z &lt;- exists</span></div><div><span class="Apple-style-span" style="font-family: monospace; font-size: 11px; line-height: 11px; white-space: pre; ">      assert $ full_adder x y z === (1,1)</span></div>
<div><span class="Apple-style-span" style="font-family: monospace; font-size: 11px; line-height: 11px; white-space: pre; ">      assert $ forall $ \ a b c -&gt; (a &amp;&amp; b) ==&gt; c === (a ==&gt; b ==&gt; c)</span></div>
<div><span class="Apple-style-span" style="font-family: monospace; font-size: 11px; line-height: 11px; white-space: pre; ">      return (x,y,z)</span></div><div><span class="Apple-style-span" style="font-family: monospace; font-size: 11px; line-height: 11px; white-space: pre; "><span class="Apple-style-span" style="font-family: arial; line-height: normal; white-space: normal; font-size: small; "><div>
<br></div><div><br></div><div>I perform a similar sharing recovery in the back end code of Numeric.RAD from the &#39;rad&#39; package and Numeric.AD.Internal.Reverse in the &#39;ad&#39; package. I have uses in a number of unreleased bottom-up applicative parser combinators as well, so it has a wide arrange of applicable situations.</div>
<div><br>Overall, let bindings tend to be a lot lighter than the accompanying arrow sugar.</div><div><br></div><div>You might find Andy Gill&#39;s write-up on type safe observable sharing in kansas lava to be useful.</div>
<div><br></div><div><a href="http://www.ittc.ku.edu/~andygill/papers/reifyGraph.pdf">http://www.ittc.ku.edu/~andygill/papers/reifyGraph.pdf</a></div><div><br></div><div>-Edward Kmett</div></span></span></div></div></div>