<div dir="ltr">Hello all,<br><br>This is a really helpful list: I&#39;ve learned half a dozen new things just by reading this month&#39;s traffic. Anyway...I have the following bit of code that updates a tree structure given a route to a leaf:<br>
<br>data Tree a = Leaf a | Node (Tree a) (Tree a)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deriving (Show, Eq)<br>data PathSelector = GoLeft | GoRight<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deriving (Show, Eq)<br>type Path = [PathSelector]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
<br>selectChild (Node left _) GoLeft = left<br>selectChild (Node&nbsp; _ right ) GoRight = right<br><br>updateNode (Node _ right) GoLeft newLeft = Node newLeft right<br>updateNode (Node left _) GoRight newRight = Node left newRight<br>
<br>updateLeaf new (Leaf previous) = Leaf new<br><br>updateTree :: Tree a -&gt; Path -&gt; a -&gt; Tree a<br>updateTree tree path newValue = case path of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [] -&gt; updateLeaf newValue tree<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (p:ps) -&gt; updateNode tree p (updateTree&#39; (selectChild tree p) ps newValue)<br><br>I wanted to rewrite updateTree without using explicit recursion. Unfortunately, the best I could come up with is:<br>
<br>upDownRecurse :: (a -&gt; b -&gt; a) -&gt; (a -&gt; c) -&gt; (a -&gt; b -&gt; c -&gt; c) -&gt; a -&gt; [b] -&gt; c<br>upDownRecurse down bottoming up = upDownRecurse&#39;<br>&nbsp;&nbsp;&nbsp; where upDownRecurse&#39; acc [] = bottoming acc<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; upDownRecurse&#39; acc (x:xs) = up acc x (upDownRecurse&#39; (down acc x) xs)<br><br>updateTree&#39; :: Tree a -&gt; Path -&gt; a -&gt; Tree a<br>updateTree&#39; tree path newValue = upDownRecurse selectChild (updateLeaf newValue) updateNode tree path<br>
<br>So what&#39;s the sexier way of doing this? <br><br>Cheers,<br><br>-- Matt<br></div>