The set of types for which a predicate or function should be specialized is best determined by profiling your application. Overuse of type specialization will result in code bloat.
Type specialization of predicates or functions which unify or compare polymorphic variables is most effective when the specialized types are built-in types such as ‘int’, ‘float’ and ‘string’, or enumeration types, since their unification and comparison procedures are simple and can be inlined.
Predicates or functions which make use of type class method calls may also be candidates for specialization. Again, this is most effective when the called type class methods are simple enough to be inlined.