On Tue, Nov 1, 2011 at 3:36 AM, Serguey Zefirov <span dir="ltr">&lt;<a href="mailto:sergueyz@gmail.com" target="_blank">sergueyz@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

2011/11/1 Ryan Ingram &lt;<a href="mailto:ryani.spam@gmail.com" target="_blank">ryani.spam@gmail.com</a>&gt;:<br>Would you mind give me some examples on how you desribe real circuits<br>
with that abstraction and, especially, an Arrow instance (even<br>
imaginary one)?<br></blockquote><div><br>Sure, here&#39;s a simple SR latch:<br><br>nor :: Circuit (Bool,Bool) Bool<br>nor = Or `Then` Not<br><br>rs :: Circuit (Bool,Bool) (Bool,Bool)<br>rs = proc (r,s) -&gt; do<br>
    rec<br>        q &lt;- nor -&lt; (r, q&#39;)<br>        q&#39; &lt;- nor -&lt; (s, q)<br>    id -&lt; (q,q&#39;)<br><br>instance Category Circuit where<br>   id = Wire<br>   (.) = flip Then<br><br>instance GArrow Circuit where<br>

    ga_first = First  -- Circuit a b -&gt; Circuit (a,c) (b,c)<br>    ga_second = Second  -- Circuit a b -&gt; Circuit(c,a) (c,b)<br>    ga_cancelr = Cancel -- Circuit (a,()) a<br>    ga_cancell = Swap `Then` Cancel -- Circuit ((),a) a<br>
    ga_uncancelr = Uncancel -- Circuit a (a, ())<br>    ga_uncancell = Uncancel `Then` Swap -- Circuit a ((),a)<br>    ga_assoc  = AssocL -- Circuit ((a,b),c)) (a,(b,c))<br>    ga_unassoc = AssocR -- Circuit (a,(b,c)) ((a,b),c)<br>
<br>instance GArrowDrop Circuit where<br>    ga_drop = Ground -- Circuit a ()<br><br>instance GArrowCopy Circuit where<br>    ga_copy = Split -- Circuit a (a,a)<br><br>instance GArrowSwap Circuit where<br>    ga_swap = Swap -- Circuit (a,b) (b,a)<br>
<br>instance GArrowLoop Circuit where<br>    ga_loop = Loop -- Circuit (a,c) (b,c) -&gt; Circuit a b<br><br>which would turn into something like<br><br>rs =<br>  -- (r,s)<br>  Loop (<br>      -- Input plumbing<br>      -- ((r,s),(q_in,q&#39;_in))<br>
      AssocL `Then`<br>      -- (r, (s, (q_in,q&#39;_in))<br>              Second (<br>                  -- (s, (q_in,q&#39;_in))<br>                  Second swap `Then`<br>                  -- (s, (q&#39;_in,q_in))<br>                  AssocR `Then` First Swap `Then` AssocL<br>
                  -- (q&#39;_in, (s,q_in))<br>              ) `Then`<br>      -- (r, (q&#39;_in, (s,q_in)))<br>      AssocR `Then`<br>      -- ((r,q&#39;_in), (s,q_in))<br>    <br>      -- Computation!<br>      First (Or `Then` Not) `Then`  -- from &quot;nor&quot;<br>
      -- (q, (s,q_in))<br>  <br>      Second (Or `Then` Not) `Then`  -- from &quot;nor&quot;<br>      -- (q, q&#39;)<br><br>      -- Output plumbing<br>      Split<br>      -- ((q,q&#39;), (q,q&#39;))<br>  ) `Then`<br>  -- (q,q&#39;)<br>
  Wire  -- from &quot;id&quot;<br><br></div><div></div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204, 204, 204);padding-left:1ex">

I am interested because I thought about an approach like that and<br>
found it not easy to use one. So I stuck with monadic netlists.<br>
</blockquote></div><br>When I did some circuit generation for the ICFP contest last year, I also went with monadic netlists.  But I had problems coming up with compile-time-enforcable guarantees like &#39;this wire is only used once&#39;<br>
<br>And really, this description is for more than circuit generation; it applies to any sort of computation that you might want to create with arrows.  I was looking at arrowized FRP earlier this year and was frustrated by how impossible it was to optimize the resulting dataflow networks.  I was continually plagued by the appearance of &#39;arr&#39; in my networks, in situations where I didn&#39;t think it belonged, and with no good way to see what that &#39;arr&#39; was actually doing.<br>
<br>  -- ryan<br>