
You're asking for something tricky here. | > type family NameCmp n m | | which totally orders datatypes. More precisely, it should return one | of the following types: | | > data NameLT = NameLT | > data NameEQ = NameEQ | > data NameGT = NameGT Now, whenever you declare a new data type T, you want, magically, the following instances to spring to life type instance NameCmp T Int = NameLT type instance NameCmp T Bool = NameLT ..etc etc etc... Obviously there would be way too many instances. So you really want a built-in magic type family NameCmp, which does what you want. Furthermore, the behaviour should be predicatable across compilers; so you'd need to specify just what the result should be in a compiler-independent way. Well I suppose you might do that (via lexical comparison of fully-qualified names), but it's clearly An Extension. Type-families alone get nowhere near. Simon