<div class="gmail_quote">On Mon, Oct 31, 2011 at 5:33 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;">
<br>For example, I would love to be able to use the arrow syntax to define objects of this type:<br><br>data Circuit a b where<br>    Const :: Bool -&gt; Circuit () Bool<br>    Wire :: Circuit a a<br>
    Delay :: Circuit a a<br>
    And :: Circuit (Bool,Bool) Bool<br>    Or :: Circuit (Bool,Bool) Bool<br>    Not :: Circuit Bool Bool<br>    Then :: Circuit a b -&gt; Circuit b c -&gt; Circuit a c<br>    Pair :: Circuit a c -&gt; Circuit b d -&gt; Circuit (a,b) (c,d)<br>

    First :: Circuit a b -&gt; Circuit (a,c) (b,c)<br>    Swap :: Circuit (a,b) (b,a)<br>    AssocL :: Circuit ((a,b),c) (a,(b,c))<br>    AssocR :: Circuit (a,(b,c)) ((a,b),c)<br>    Loop :: Circuit (a,b) (a,c) -&gt; Circuit b c<br>

etc.<br><br>Then we can have code that examines this concrete data representation, converts it to VHDL, optimizes it, etc.<br></blockquote><div><br>As mentioned by others, Adam Megacz&#39;s generalized arrow (and its syntax) could accomplish this. But if all you want is VHDL and the like, consider Conal Elliott&#39;s work on Vertigo, Pan, Compiling Embedded Languages [1], and the similar work on the Haskell GPipe package.</div>
<div><br></div><div>[1] <a href="http://conal.net/papers/jfp-saig/">http://conal.net/papers/jfp-saig/</a></div><div> </div><div>Regards,</div><div><br></div><div>Dave</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>However, due to the presence of the opaque &#39;arr&#39;, there&#39;s no way to make this type an arrow without adding an &#39;escape hatch&#39;<br>
    Arr :: (a -&gt; b) -&gt; Circuit a b<br>which breaks the abstraction: circuit is supposed to represent an actual boolean circuit; (Arr not) is not a valid circuit because we&#39;ve lost the information about the existence of a &#39;Not&#39; gate.<br>

<br>The arrow syntax translation uses arr to do plumbing of variables.  I think a promising project would be to figure out exactly what plumbing is needed, and add those functions to a sort of &#39;PrimitiveArrow&#39; class.  All of these plumbing functions are trivially implemented in terms of &#39;arr&#39;, when it exists, but if it doesn&#39;t, it should be possible to use the arrow syntax regardless.<br>
<font color="#888888">
<br>  -- ryan<br>
</font><br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br>