On Mon, Jan 5, 2009 at 10:09 AM, Peter Verswyvelen <span dir="ltr">&lt;<a href="mailto:bugfact@gmail.com">bugfact@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Classic FRP (&quot;CFRP&quot;, like Fran, FAL, Reactive, Grapefruit?...)<br>
exposes signals as first class values.<br>
<br>
Arrow based FRP (&quot;AFRP&quot;, like Fruit, Yampa...) hides signals as first<br>
class values; instead the signal transformers are the first class<br>
values.<br>
<br>
Can I conclude that it would theoretically be possible to translate an<br>
AFRP function into a CFRP function? I.e. is AFRP a subset of CFRP?</blockquote><div><br>Why don&#39;t you check yourself?&nbsp; <br><br>AFRP, if I recall correctly, has Arrow and ArrowLoop.&nbsp; So the combinators we need follow:<br>
<br>Using a ~&gt; b as shorthand for Behavior a -&gt; Behavior b.<br><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp; -- From Arrow</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp; arr :: (a -&gt; b) -&gt; (a ~&gt; b)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp; first :: (a ~&gt; b) -&gt; ((a,c) ~&gt; (b,c))</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp; (&gt;&gt;&gt;) :: (a ~&gt; b) -&gt; (b ~&gt; c) -&gt; (a ~&gt; c)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp; </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp; arr = fmap</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp; first f ac = liftA2 (,) (f (fst &lt;$&gt; ac)) (snd &lt;$&gt; ac)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp; (&gt;&gt;&gt;) = (&gt;&gt;&gt;)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp; -- From ArrowLoop</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp; loop :: ((a,c) ~&gt; (b,c)) -&gt; (a ~&gt; b)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp; loop f a = let bc = f (liftA2 (,) a (snd &lt;$&gt; bc)) in fst &lt;$&gt; bc</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;</span><br style="font-family: courier new,monospace;">So that&#39;s a positive on all the arrow combinators.&nbsp; You have to check the supplied primitives, too, such as integral and pswitch.&nbsp; Once you do that, you could even implement a ClassicFRP arrow and use that instead of the Yampa arrow, so the client code wouldn&#39;t need to be changed at all.<br>
<br>What I have just described is the ideal situation.&nbsp; Here are some of the practicalities you might run into:<br><br>&nbsp; * AFRP models events as signals of Maybe.&nbsp; Semantically speaking, signals of Maybe don&#39;t have nice eventy properties, such as discrete occurrences, so you might have some difficulty translating between the two.&nbsp; I&#39;m currently exploring an arrow model that accounts for events properly, but that probably doesn&#39;t help you.<br style="font-family: courier new,monospace;">
&nbsp; * The above &quot;loop&quot; combinator is key to eliminating quadratic behavior in certain classic FRP situations, and I believe the reason arrows were explored to begin with.&nbsp; See &quot;Plugging a Space Leak with an Arrow&quot; by Hudak and Liu[1] for more.&nbsp; In Fran-like systems, there is another fix for this leak, in exchange for loss of perfect reactivity (making a &quot;discrete memo table&quot; of sorts).<br>
<br>[1] <a href="http://www.cs.yale.edu/%7Ehl293/download/leak.pdf"><cite>www.cs.yale.edu/~hl293/download/<b>leak</b>.pdf</cite></a><br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<br>
Thanks,<br>
Peter<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>
</blockquote></div><br>