At its core, Haskell's inference is based on Hindley-Milner, which gives you complete results as soon as when infering the type of an application, 类型变量 (e.g. the A and B in the example above) can be only instantiated with 非多态性 types (I'm simplifying, but this is essentially the ML-style polymorphism you can find in e.g. Ocaml.).
class BreakfastFood food where
makeBreakfast :: food -> String
instance BreakfastFood Eggs where
makeBreakfast = "First crack 'em, then fry 'em"
instance BreakfastFood Toast where
makeBreakfast = "Put bread in the toaster until brown"