[Haskell-cafe] predicates in XML toolboxes
Graham Klyne
GK at ninebynine.org
Thu Apr 14 04:27:08 EDT 2005
At 13:48 12/04/05 +0100, Malcolm Wallace wrote:
>Henning Thielemann <lemming at henning-thielemann.de> writes:
>
> > >> predicates a -> Bool
> > >> selectors, transformators a -> a
> > >> list-valued functions a -> [a]
> >
> > What about providing combinators for the most common cases and provide
> > lifting functions for the uncommon cases, such as
> >
> > liftPred :: (a -> Bool) -> (a -> [a])
> > liftPred p x = if p x then [x] else []
> >
> > liftTrans :: (a -> b) -> (a -> [b])
> > liftTrans f x = [f x]
>
>Looks good. If you want to come up with a concrete design for an fuller
>set of alternative combinators, I'd be happy to include it into HaXml as
>a further choice of facility.
Obliquely related to this thread:
When I added namespace support and other stuff to HaXml, I added (a) and
"infoset" type parameter to the XML document type [1], and (b) a new
transformation type [2] so that I could create new document types with
additional information in the Haskell data to support features like XML
namesspaces and xml:base.
I think your proposals could also be added into this framework, with the
additional wrinkle that using a 'newtype' in the "infoset" value type, one
could maybe achieve a degree of type safety, but at the cost of losing some
of the algebraic properties of a 'CFilter'.
My version is on my web site (sorry I'm offline and can't find the actual
URI right now).
#g
--
[1] From my version of Text.XML.HaXml.Types:
[[
data DocumentI i = Document Prolog (SymTab EntityDef) (ElementI i)
data ElementI i = Elem QName i [Attribute] [ContentI i]
data ElemTag = ElemTag Name [Attribute] -- ^ intermediate for parsing
type Attribute = (QName, AttValue)
data ContentI i = CElem (ElementI i)
| CString Bool CharData -- Bool flags whitespace significance
| CRef Reference
| CMisc Misc
| CErr String -- Fudge to get error diagnostics
-- from a filter
data ElementInfoset = EI
{ eiNamespaces :: [Namespace]
, eiBase :: String
-- Non-infoset values
-- (in xml namespace: http://www.w3.org/XML/1998/namespace)
, eiLang :: String
, eiSpace :: Bool -- True=preserve, False=default
-- ? , eiIdent :: String -- xml:id, or other ID value?
} deriving Show
]]
So that:
[[
type Document = DocumentI ()
type Element = ElementI ()
type Content = ContentI ()
]]
Provide compatibility with existing HaXml, but I can use
[[
DocumentI ElementInfoset
ElementI ElementInfoset
ContentI ElementInfoset
]]
...
[2] From my version of Text.XML.HaXml.Combinators:
[[
type CTransform i1 i2 = ContentI i1 -> [ContentI i2]
type CFilterI i = CTransform i i
type CFilter = CFilterI ()
]]
------------
Graham Klyne
For email:
http://www.ninebynine.org/#Contact
More information about the Haskell-Cafe
mailing list