PolySubML: A simple ML-like language with subtyping, polymorphism, higher rank types, and global type inference