At 13:48 12/04/05 +0100, Malcolm Wallace wrote:
Henning Thielemann [EMAIL PROTECTED] writes:
predicates a - Bool
selectors, transformatorsa - a
list-valued functionsa - [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
| CRefReference
| CMisc Misc
| CErrString-- 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
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe