<div dir="ltr">That makes sense! I did not realize the shadowing a where clauses causes happens within the where clause itself; I thought it only applied outside. Thanks, Tom!<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 12, 2015 at 2:46 AM, Tom Ellis <span dir="ltr"><<a href="mailto:tom-lists-haskell-cafe-2013@jaguarpaw.co.uk" target="_blank">tom-lists-haskell-cafe-2013@jaguarpaw.co.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Thu, Mar 12, 2015 at 12:49:57AM -0700, Jeffrey Brown wrote:<br>
>     totalDescendents :: S.Set Glab -> Graph -> S.Set Glab<br>
>     totalDescendents roots graph = b<br>
>       where (a,b,c,graph) = totalDescendentsCtrlr  -- tricky<br>
>                             (roots, S.empty, M.empty, graph)<br>
><br>
>     totalDescendentsCtrlr :: TotalDescendentsData -> TotalDescendentsData<br>
>     totalDescendentsCtrlr (a,b,c,gr) =<br>
>       if S.null a' -- fails, as does a == a'<br>
>         -- a == a' is one iteration slower but should have same effect<br>
>         then                       (a',b',c',gr')<br>
>         else totalDescendentsCtrlr (a',b',c',gr')<br>
>       where (a',b',c',gr') = visitUndetPrds $ visitTdSnvSucs (a,b,c,gr)<br>
><br>
> Notice that in the equation marked "tricky", the object "graph" appears on<br>
> both sides. I thought that was the problem, so I rewrote that line as the<br>
> following:<br>
>       where (_,b,_,_) = totalDescendentsCtrlr<br>
> and sure enough, the problem vanished.<br>
<br>
</span>It's somewhat bizarre to write<br>
<span class=""><br>
       where (a,b,c,graph) = totalDescendentsCtrlr  -- tricky<br>
                             (roots, S.empty, M.empty, graph)<br>
<br>
</span>if<br>
<br>
       where (_,b,_,_) = totalDescendentsCtrlr<br>
<br>
works, but it's a fair question from a desire to understand what's going on.<br>
<br>
When you write<br>
<span class=""><br>
      where (a,b,c,graph) = totalDescendentsCtrlr  -- tricky<br>
                             (roots, S.empty, M.empty, graph)<br>
<br>
</span>you are introducing a new name `graph` which shadows the old one.  The<br>
result `graph` is "fed back in" as the input.  You are saying that the value<br>
of `graph` depends on itself, which in general can lead to looping.  You<br>
probably meant<br>
<br>
      where (a,b,c,graph') = totalDescendentsCtrlr (roots, S.empty, M.empty, graph)<br>
<br>
or, since many of those variables are unused, as you said<br>
<br>
      where (_,b,_,_) = totalDescendentsCtrlr (roots, S.empty, M.empty, graph)<br>
<span class=""><br>
> So I tried to distill that problem to something tiny, and came up with this:<br>
><br>
>   f (a) = a'<br>
>     where (a',b) = fBackend (a,b) -- tricky<br>
><br>
>   fBackend (a,b) =<br>
>     if a' < 1<br>
>       then          (a',b)<br>
>       else fBackend (a',b)<br>
>     where a' = a - 1<br>
><br>
> I see no substantive difference between the problem with the first body of<br>
> code and the problem I expected f and fBackend to have -- but f and<br>
> fBackend work fine!<br>
<br>
</span>`fBackend` never does anything with the value of `b` whereas presumably<br>
`visitUndetPrds` and `visitTdSnvSucs` do do something with the value of<br>
`graph`.<br>
<br>
Tom<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br></div>