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 builtin types such as
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.