Jonathan Blow is creating a new language with an interesting idea for this: if you have 'fn f(a:$T, b:T) -> T', the $ means: T is a polymorphic (generic) type and 'a' is the parameter which defines the value of the type so if there is a type mistake you get nicer error message.
Unfortunately the description of this future language only exist in videos currently: https://www.youtube.com/playlist?list=PLmV5I2fxaiCKfxMBrNsU1...