[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