[Haskell-cafe] HaXmL and the IO Monad
Graham Klyne
GK at ninebynine.org
Mon Jan 24 11:45:12 EST 2005
At 14:53 21/01/05 +0000, John Goerzen wrote:
>I've been playing with HaXmL lately. I've had a need to convert one XML
>document to another, and HaXmL was very nice for that.
>
>Along the way, I've discovered that I need to do some I/O as part of the
>conversion (specifically due to timezone-related calculations). Much of
>HaXML is based around the CFilter type:
<later>
I just saw David Roundy's response, and think that's way better than my
approach (below).
</later>
In my modifications to HaXml [1], in re-working the external entity
inclusion, I did indeed resort to using unsafePerformIO (which may be
original HaXml, I don't recall). Later, I thought of a cleaner approach
which would be to make the XML parsing parameterized (somehow, I forget the
details right now) on a monadic function for entity retrieval. For calling
functions that don't want to be forced into the IO monad, use an identity
monad, which in turn would not allow external entities, otherwise use an IO
function. This approach is specialized to a particular use of IO, and
requires modifying the HaXml code. When I get time (not in the foreseeable
future), it's a change I'd like to apply to get rid of the
unsafePerformIO. I already have alternative parsing functions with/without
external entity support to distinguish internal and external XML subset cases.
I haven't actually worked out the details for using a monad, so I could be
completely deluded here.
[1] http://www.ninebynine.org/Software/HaskellUtils/HaXml-1.12/
Specifically:
http://www.ninebynine.org/Software/HaskellUtils/HaXml-1.12/src/Text/XML/HaXml/SubstitutePE.hs
which currently has alternative functions peNullResolver and peExtResolver
to handle cases that are permitted/not permitted to perform IO, calling in
turn:
http://www.ninebynine.org/Software/HaskellUtils/HaXml-1.12/src/Text/XML/HaXml/EntityHelpers.hs
http://www.ninebynine.org/Software/HaskellUtils/HaXml-1.12/src/Text/XML/HaXml/ExtEntity.cpphs
#g
--
At 15:17 20/01/05 -0500, Mark Carroll wrote:
>I tried writing a little command-line utility to find the relative path of
>one thing from another thing (with Unix-like systems in mind). For example,
At 14:53 21/01/05 +0000, John Goerzen wrote:
>I've been playing with HaXmL lately. I've had a need to convert one XML
>document to another, and HaXmL was very nice for that.
>
>Along the way, I've discovered that I need to do some I/O as part of the
>conversion (specifically due to timezone-related calculations). Much of
>HaXML is based around the CFilter type:
>
>type CFilter = Content -> [Content]
>
>That is, most of the stuff one does in HaXML is a function with that
>type.
>
>Try as I might, I could not figure out a nice way to integrate I/O into
>this system. A simple IO CFilter wouldn't work, since there has to be
>input available when it runs. Content -> IO [Content] didn't work
>either, since the IO ripples up all the way to the top, messing up the
>nice code everywhere.
>
>I finally resorted to unsafePerformIO to get it done. But I'd like to
>know the proper solution. I do hope that this is not it :-)
>
>Thanks,
>John
>
>
>_______________________________________________
>Haskell-Cafe mailing list
>Haskell-Cafe at haskell.org
>http://www.haskell.org/mailman/listinfo/haskell-cafe
------------
Graham Klyne
For email:
http://www.ninebynine.org/#Contact
More information about the Haskell-Cafe
mailing list