first, `flen` must be monadic computation because it needs access to the Q monad
second, define it recursively:
flen t | t=='Word8 = return 1 flen t | t=='Word16 = return 2 flen t = do -- Get information about type t, assuming it is declared as -- one-constructor "data", such as "data T = T Int16 Word32" TyConI (DataD _ _ _ [constructor] _) <- reify t -- Get types of individual fields let fields = fieldTypes constructor -- Calculate len for each field flens <- mapM flen fields return (sum flens)
Thank you. This makes a lot of sense. My only problem with this is the declarations of the base types in the generator: flen t | t == 'Word8 = return 1 This precludes someone from adding other base types without modifying the generator.
I have a record name and a field name (and a field type name), all as strings.
passing them as the strings is not good idea. it's better to keep them as Name values (Name type is defined in TH)
*nod* The strings were my first step to get things working before I explore more TH syntax.
Bulat mailto:bulatz@HotPOP.com
Thank you for your insights. Tim Newsham http://www.lava.net/~newsham/