<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br><blockquote type="cite"><div><br>sry for being a bit thick, but how would this code be used?<br><br>I'm unable to figure out the application yet. Could you give some examples how you use it?<br><br><br>GŁnther<font class="Apple-style-span" color="#000000"><font class="Apple-style-span" color="#144FAE"><br></font></font></div></blockquote><br></div><div>So, the type (View view) -- ignoring class instances -- is basically isomorphic to this (slightly simpler) type:</div><div><br></div><div>data View = EmptyView | TextView String | ConcatView View View | NestViews View View View | ...</div><div>instance Monoid View where ...</div><div><br></div><div>Now, consider the problem of "generic programming" on the simpler type: &nbsp; you quantify over the data constructors "generically", and in doing so you gain "traversals" for the type.[1] &nbsp;You gain the same things by turning View into (View view) -- &nbsp;a functor, a foldable functor, and so on. &nbsp;When it comes time to "render" a format for a View (for example, a bit of Html from Text.XHtml.Strict), I use some higher order functions I'm already familiar with. &nbsp;Something like</div><div><br></div><div><font class="Apple-style-span" face="Courier" size="3"><span class="Apple-style-span" style="font-size: 12px;">renderXHtml :: (View view) -&gt; Html</span></font></div><div><font class="Apple-style-span" face="Courier" size="3"><span class="Apple-style-span" style="font-size: 12px;">renderXHtml (ConcatViews l r) = fold $ renderXHtml (ConcatViews l r)</span></font></div><div><font class="Apple-style-span" face="Courier" size="3"><span class="Apple-style-span" style="font-size: 12px;">renderXHtml (NestViews l m r) = fold $ renderXHtml (NestViews l m r)</span></font></div><div><font class="Apple-style-span" face="Courier" size="3"><span class="Apple-style-span" style="font-size: 12px;">renderXHtml (TextView string) = stringToHtml string</span></font></div><div><font class="Apple-style-span" face="Courier" size="3"><span class="Apple-style-span" style="font-size: 12px;">renderXHtml (PageView v_title, v_heading, v_header, v_footer, v_contents) =&nbsp;</span></font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="Courier" size="3"><span class="Apple-style-span" style="font-size: 12px;">        </span></font></span><font class="Apple-style-span" face="Courier" size="3"><span class="Apple-style-span" style="font-size: 12px;">(the_title &lt;&lt; (renderXHtml v_title)) +++ &nbsp; &nbsp; &nbsp; &nbsp; -- (We assume v_title is a TextView String)</span></font></div><div><font class="Apple-style-span" face="Courier" size="3"><span class="Apple-style-span" style="font-size: 12px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;(body &lt;&lt; ( renderXHtml v_header ) &nbsp;+++&nbsp;</span></font></div><div><font class="Apple-style-span" face="Courier" size="3"><span class="Apple-style-span" style="font-size: 12px;"><span class="Apple-tab-span" style="white-space:pre">                </span>&nbsp;(render_page_contents v_contents v_heading) +++&nbsp;</span></font></div><div><font class="Apple-style-span" face="Courier" size="3"><span class="Apple-style-span" style="font-size: 12px;"><span class="Apple-tab-span" style="white-space:pre">                </span>&nbsp;(renderXHtml v_footer) )</span></font></div><div><font class="Apple-style-span" face="Courier"><span class="Apple-tab-span" style="white-space:pre">                </span>&nbsp;where render_page_contents contents heading = undefined -- takes a View and uses the page's heading View</font></div><div><font class="Apple-style-span" face="Courier"><span class="Apple-tab-span" style="white-space:pre">                                                                        </span>&nbsp;-- so I guess we assume v_heading is a function</font></div><div><font class="Apple-style-span" face="Courier"><span class="Apple-tab-span" style="white-space:pre">                                                </span>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -- into a TextView</font></div><div><br></div><div>...</div><div><br></div><div>You could potentially use (&gt;&gt;=) for this, directly. &nbsp;</div><div><br></div><div>And if you were using the simpler type, you could do the same thing with Uniplate, for example. &nbsp;It's going to construct an automorphism for you.</div><div><br></div><div>[1] &nbsp;Actually, it's "the other way around". &nbsp;But the container/contained adjunction makes them equivalent.</div></body></html>