As a small example, let's say I have a typed "agg" function with associated typeclass:
class typedAgg t where
agg :: t f r a b -> (r a -> b) -> f (r a) -> f b
...
To lots of people, that's going to be really confusing. It might be easier if I document that f is supposed to be the type of the table, r is the type of the row, and a is the type of elements in the rows, if that's the intended usage.