What is Hindley-Milner and why is it cool? (2008)
The trend seems to be for languages to have forward inference of types within functions, while declaring them in function definitions. Assignments which initialize a variable also implicitly declare its type.  C++ started this with "auto", but it's really because programmers had become used to dynamic languages where assignment set type.  Go and Rust both do this.Inferring types of function parameters and results isn't as useful. Combined with generics, it gets really complicated.  It seems better to have those declared explicitly. Programmers need to be able to read function signatures when programming. They're an essential part of the documentation.  Also, whole-program type inference and separate compilation inherently conflict.That's pretty much where things seem to be settling out. Even Python now has optional type declarations for function signatures.