The hardest part of type inference in polymorphic systems is not computing types - it is deciding when to commit. In a system with intersection types or universal quantifiers, there are typing rules that are not syntax-directed: the same expression can receive different types depending on which rules you apply and in which order. A greedy inference algorithm that makes decisions early can close off valid typings that would have been correct if it had waited.