
Hi
I don't see the problem. You can read all of Bulat's examples as "'thing being declared' 'relationship' 'value' given that 'context'", so this one is ""sequence" has type "[m a] -> m [a]" given that "m" is a "Monad"". So viewed that way, they're all consistent with each other.
How about name, context, value as the three elements: class <name> | <context> where <value> data <name> | <context> = <value> type <name> | <context> = <value> <name> | <context> :: <value> For class and data, you can argue that it isn't really a <value>, its <inner> or something. But type definately has a <value>. And if you want data and type consistent, you need to put them like that. And then, if you want functions consistent with types, you have to do the above. Or at least thats what my brain interprets as logical, and on the plus side it changes data/type/class which I personally don't like, but doesn't change function declarations, which I am not aware of anyone having issue with. Thanks Neil