Static type checking is the process of detecting nonsensical operations based on their domains at compile time. While its benefits no longer need to be argued, static typing comes with expressiveness limitations that can only be lifted at the expense of complexity. This problem is particularly antithetical to generic programming, where algorithms and data structures are designed in the most general setting possible. In response, some systems have adopted a form of static duck typing: generic definitions are written against assumed interfaces that are only type checked with concrete types at their ultimate use sites.
This paper claims that such an approach, which we refer to as \emph{use site checking}, is harmful to the user experience. We study four main problems caused by use site checking and show how they relate to similar well-known issues in dynamically typed languages. We then discuss how statically typed languages should address these shortcomings.