{-# LANGUAGE DeriveDataTypeable #-} import Data.Generics data D1 = D1 Int String deriving (Data, Typeable) data D2 = D2 D1 Int (Int -> Int) deriving (Data, Typeable) count :: (Data a, Typeable b) => b -> a -> Int count t = everything (+) (0 `mkQ` c t) where c :: a -> a -> Int c _ _ = 1 main = do let c = undefined :: Char i = undefined :: Int ii = undefined :: Int -> Int s = [c,c,c] d = D2 (D1 i s) i ii print . count c $ d print . count i $ d print . count ii $ d print . count s $ d