(skipping redundant types) its fairly complex but doesn't touch gfoldl, and most of the difficult code can be stolen from Uniplate.

From your thesis/paper, it seems that queries, such as 'bill' in the
Paradise benchmark, are the worst offenders, performancewise, and applying your techniques for Uniplate to the SYB query for 'bill' seems to achieve a similar reduction in runtime.
'contains' is interesting, and seems to generalise directly to SYB, one
just needs to know the domains of functions - I have long wanted a way to specify the domain of SYB-style overloaded functions (instead of hiding specific domains in near polymorphic types), but never considered IntSets of TypeRepKeys!-)

I couldn't quite figure out how to make a type-dependent CAF in the class instances, as your paper suggests, so I made my CAF at the top-level instead, a Map from TypeRepKeys to IntSets representing all substructure types, recursively computed from roots like the Company type (having to list those roots explicitly is not so
nice, presumably your approach avoids that?).

The query and scheme change only minimally, to add the domain
of the query function, and to shortcut the scheme if there are no
domain members in the substructure types:

bill = everything' (+) 0 domain (0 `mkQ` billS)
 where billS (S s) = s
       domain = singleton (getDomainKey billS)

everything' :: (r -> r -> r) -> r -> Domain -> GenericQ r -> GenericQ r
everything' k z domain f x
 | not $ IS.null $ domain `intersection` getSubs x
 = foldl k (f x) (gmapQ (everything' k z domain f) x)
 | otherwise
 = z

getSubs x = Map.findWithDefault (error ("missing key: "++show (typeOf x))) (key 
x) subMap
subMap = fromRoot genCom Map.empty
 where fromRoots rs map = foldl' (\m (DataBox x)->fromRoot x m) map rs

       fromRoot :: Data a => a -> Map.Map Int IntSet -> Map.Map Int IntSet
       fromRoot root map | Map.member (key root) map = map
       fromRoot root map | otherwise                 = fromRoots (contains 
root) map'
         where map' = Map.insert (key root) (allSubs root) map

While your optimizations are nice, your text might have
mentioned that some of them apply to SYB as well?-)

Claus

_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to