<div class="gmail_quote">On Thu, Jun 4, 2009 at 9:13 AM, wren ng thornton <span dir="ltr">&lt;<a href="mailto:wren@freegeek.org">wren@freegeek.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<div class="im"></div>
The Visitor pattern isn&#39;t a functor, it&#39;s a collection of things. The type being visited is the functor[1], the set of methods on that type for accepting a visitor is a catamorphism[2], and the visitor itself is an algebra for the functor[3].<br>


<br>
<br>
[1] Or rather, the coproduct of all related classes that can chain a visitor forms a type, and that type is a functor.<br>
<br>
<br>
[2] For the recursive Visitor pattern I use most often, that is. For the non-recursive version it&#39;s usually fmap. This is the part where the pattern gets a bit shaky because there are actually many different patterns all called &quot;Visitor&quot;. The main points of interest are whether it&#39;s recursive or not, and whether it applies the visitor to itself, to its children, or both.<br>


<br>
non-recursive + itself == ($)<br>
<br>
non-recursive + children == fmap (under open-recursion interpretation of the type, aka all nodes are elements)<br>
<br>
recursive + children == fmap (under closed-recursion interpretation, aka only fringe nodes are elements)<br>
<br>
recursive + both == cata (usually, though it depends how you aggregate)<br>
<br>
recursive + itself == This is actually a variant of the Iterator pattern</blockquote></div><br>Could you be so kind to give an example for each?<br><br>Cheers,<br><br>Johan<br><br>