  System F, the polymorphic lambda calculus, features the principle of
impredicativity: polymorphic types may be (explicitly) instantiated at other
types, enabling many powerful idioms such as Church encoding and data
abstraction. Unfortunately, type applications need to be implicit for a
language to be human-usable, and the problem of inferring all type applications
in System F is undecidable. As a result, language designers have historically
avoided impredicative type inference.
  We reformulate System F in terms of call-by-push-value, and study type
inference for it. Surprisingly, this new perspective yields a novel type
inference algorithm which is extremely simple to implement (not even requiring
unification), infers many types, and has a simple declarative specification.
Furthermore, our approach offers type theoretic explanations of how many of the
heuristics used in existing algorithms for impredicative polymorphism arise.
