Hello Tim, Friday, January 20, 2006, 12:51:39 PM, you wrote: TN> flen ("Word8",_,_) should compute "containerLength newWord8" TN> flen ("Word16",_,_) should compute "containerLength newWord16" TN> flen ("IP",_,_) should compute "containerLength newIP" TN> flen (n,_,_) should compute "containerLength" of ("new"++n) 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) ... i attached the finally debugged version together with test you can't run at compile time your run-time function `containerLength`, so you just need to arrange these calcultaions yourself, using `reify` to get fieldlist for each data type
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) -- Best regards, Bulat mailto:bulatz@HotPOP.com