data Bar { val1 :: String, val2 :: Int -- omit this in serialization } .. which could be generalized to a sort of 'annotation type', e.g.
type Ann a b = a type Omitted = () -- a particular annotation ... val2 :: Ann Int Omitted
you could have multiple annotations, e.g.
val2 :: Ann Int (Omitted,Ann1,Ann2) -- an Int with three annotations
try googling for "phantom types"? ..
type Omitted a = () ... val2 :: Ann Int (Omitted 1000)
if you bake the default into the type, you can have only one per type per program, so how about using a class to map from type to default value? class Default a where default :: a valn :: Default a => a instance Default Bar where default = Bar undefined 1000 or instance Default Int where default = 1000 then you could omit types that have defaults, or use/infer an omit annotation for fields that the default for the enclosing type can fill in. Parsing a slightly extended data syntax might be easier than overloading the type system, but maybe that is just me?-) Claus ps if you absolutely want to go for more type-level programming, Oleg has some notes on number- parameterized types http://okmij.org/ftp/Haskell/number-parameterized-types.html