<div dir="ltr"><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif">Thanks Stephen,</font></font></font><div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif"><br></font></font></font></div>

<div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif">That looks like a nice set of slides.</font></font></font></div><div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif"><br>

</font></font></font></div><div><font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif">You&#39;re right that what I call the mapFn and the reduceFn could be combined into one function.  Logically, though, I think it&#39;s more intuitive if they are separated.  In addition, it seems important to allow for the possibility of having a function at the terminal point. For example, here&#39;s how I would define merge.</font></font></font><div>

<font color="#003333"><font size="2"><font face="trebuchet ms,sans-serif"><br></font></font></font></div><div><font class="Apple-style-span" color="#003333" face="&#39;trebuchet ms&#39;, sans-serif"><div>merge xs ys =</div>

<div>   recursionEngine</div><div>        (\(xs, ys) -&gt; null xs || null ys) </div><div>        (\(xs, ys) -&gt; xs ++ ys)  </div><div>        (:)                           </div><div>        (\(x:xs, y:ys) -&gt; min x y)  </div>

<div>        (\(x:xs, y:ys) -&gt; if x &lt;= y then (xs, y:ys) else (x:xs, ys))</div><div>        (xs, ys)    </div><div><br></div><div>I&#39;m not sure how to translate that into the genPR formulation.</div><div><br></div>

<div>merge xs ys =</div><div>   genPR </div><div>        (\(xs, ys) -&gt; null xs || null ys)</div><div>        (\(x:xs, y:ys) -&gt; if x &lt;= y then (xs, y:ys) else (x:xs, ys))</div><div>        &lt;There is no constant that goes here.&gt;</div>

<div>        (\(x:xs, y:ys) merged -&gt; (min x y) : merged)</div><div><br></div><div>Besides the problem with the third argument, the fourth argument is  awkward since it must take both heads, take their min, and then add them to the result of the recursive call. I&#39;d prefer to take the heads and the min in a separate step as in the fourth argument to recursionEngine.</div>

</font></div><div><div><font class="Apple-style-span" color="#003333" face="&#39;trebuchet ms&#39;, sans-serif"><br></font></div><div><div><font class="Apple-style-span" color="#003333" face="&#39;trebuchet ms&#39;, sans-serif"><br>

</font></div><div><div dir="ltr"><font><font face="&#39;trebuchet ms&#39;, sans-serif"><i><font color="#003333">-- Russ </font></i></font></font></div>
<br><br><div class="gmail_quote">On Sat, Nov 6, 2010 at 2:10 AM, Stephen Tetley wrote: <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><br>
Hello Russ<br>
<br>
Richard Kieburtz has a slightly smaller formulation of primitive<br>
recursion on page 13 of these slides - the fold-like argument &#39;h&#39;<br>
doesn&#39;t appear to need a change of type:<br>
<br>
<a href="http://programatica.cs.pdx.edu/P/Programatica%20Logic1.pdf" target="_blank">http://programatica.cs.pdx.edu/P/Programatica%20Logic1.pdf</a><br>
<br>
genPR :: (a -&gt; Bool) -&gt; (a -&gt; a) -&gt; c -&gt; (a -&gt; c -&gt; c) -&gt; a -&gt; c<br>
genPR p b g h x = if p x then g else h x (genPR p b g h (b x))<br>
<br>
<br>
-- factorial function:<br>
fact :: Integer -&gt; Integer<br>
fact = genPR (==0) (subtract 1) 1 (*)<br>
<br>
Ignoring changes in argument order, the type of your recursionEngine<br>
is one term and one type variable larger:<br>
<br>
recursionEngine :: (a -&gt; Bool) -&gt; (a -&gt; c) -&gt; (b -&gt; c -&gt; c) -&gt; (a -&gt;<br>
b) -&gt; (a -&gt; a)-&gt; a -&gt; c<br>
<br>
Best wishes<br>
<br>
Stephen<br>
<br>
<br><br>
</blockquote></div><br></div></div></div></div></div>