[Haskell-cafe] Re: Heterogeneous Data Structures - Nested Pairs
and functional references
Alexander Solla
ajs at 2piix.com
Thu Feb 18 15:11:01 EST 2010
>
> sry for being a bit thick, but how would this code be used?
>
> I'm unable to figure out the application yet. Could you give some
> examples how you use it?
>
>
> Günther
So, the type (View view) -- ignoring class instances -- is basically
isomorphic to this (slightly simpler) type:
data View = EmptyView | TextView String | ConcatView View View |
NestViews View View View | ...
instance Monoid View where ...
Now, consider the problem of "generic programming" on the simpler
type: you quantify over the data constructors "generically", and in
doing so you gain "traversals" for the type.[1] You gain the same
things by turning View into (View view) -- a functor, a foldable
functor, and so on. 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. Something like
renderXHtml :: (View view) -> Html
renderXHtml (ConcatViews l r) = fold $ renderXHtml (ConcatViews l r)
renderXHtml (NestViews l m r) = fold $ renderXHtml (NestViews l m r)
renderXHtml (TextView string) = stringToHtml string
renderXHtml (PageView v_title, v_heading, v_header, v_footer,
v_contents) =
(the_title << (renderXHtml v_title)) +++ -- (We assume
v_title is a TextView String)
(body << ( renderXHtml v_header ) +++
(render_page_contents v_contents v_heading) +++
(renderXHtml v_footer) )
where render_page_contents contents heading = undefined -- takes a
View and uses the page's heading View
-- so I guess we assume v_heading is a function
-- into a TextView
...
You could potentially use (>>=) for this, directly.
And if you were using the simpler type, you could do the same thing
with Uniplate, for example. It's going to construct an automorphism
for you.
[1] Actually, it's "the other way around". But the container/
contained adjunction makes them equivalent.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20100218/2bb431a9/attachment.html
More information about the Haskell-Cafe
mailing list