I agree with you that lifetimes are like another kind of high level information. But IMHO, as they can be applied on the generic arguments, I think that it would be clearer if they were declared first on their own. For example, having the following declaration:
struct Reader<'a, T: 'a> {
position: uint,
data: &'a [T]
}
I think that it would be clearer something like the following:
struct Reader<'a><T:'a> {
position: uint,
data: &'a [T]
}
struct Reader['a]<T:'a> {
position: uint,
data: &'a [T]
}
But this is just my opinion after being in contact with the language only for a tiny amount of time, coming from a C++, Java background.