Jim, > Why is > > gfindtype :: (Data x, Data y) => x -> Maybe y > > and not > > gfindtype :: (Data x, Typeable y) => x -> Maybe y > > ? Because you're not always interested in a subterm of the same type as the parent node. gfindtype "abc" :: Maybe Char -- yields Just 'a' gfindtype "abc" :: Maybe String -- yields Just "bc" HTH, Stefan