This article defines a set of type inference rules for resolving overl
oading introduced by type classes, as used in the functional programmi
ng language Haskell. Programs including type classes are transformed i
nto ones which may be typed by standard Hindley-Milner inference rules
. In contrast to other work on type classes, the rules presented here
relate directly to Haskell programs. An innovative aspect of this work
is the use of second-order lambda calculus to record type information
in the transformed program.