An Anecdote About ML Type Inference (1994)
web.archive.org
web.archive.org
Great example though. When looking at Idris I had the impression there was a logical end point of having the type system so descriptive that, given the type of a function, there was only one possible implementation.
I suppose back then we were still in the throes of "object-oriented is best" and the "object" in OCaml had some pull
Shame there isn't more non-academic support for it.
If you like SML, check out F#. I did part one of that course in SML, F#, Typed Racket, and Scala. F# was by far the cleanest and most concise for each homework assignment. (Most code was written in SML first and then ported to the other languages.)
F# has become my side-project language.
There's also an SML compiler generating Javascript: http://www.smlserver.org/smltojs/
Just as a simple demo, I combined it with Processing, to make this little thing: http://hjemmesider.diku.dk/~dybber/processing-sml/
The trouble with inferring everything is someone reading the functions has no idea what the restrictions are. The classic Python example involves "lists" (built-in arrays) vs NumPy arrays. They implement most of the same operators and functions, but with different semantics. For built-in arrays, "+" means concatenate.
- OCaML has OO cruft and OCaML folks themselves keep telling you "Oh, you don't have to use the OO parts of OCaML"
Well then effin give me an ML that's more modern than SML, and has no OO cruft!
don't tell me "take this stuff that we think is good, and just ignore parts of it that are bad"
(and I'm not interested in Haskell).
edit: Matt Might lists only two other languages [0], Scala and Scheme. Both are not ML (though I think some folks think Scala is an ML?)
[0] http://matt.might.net/articles/best-programming-languages/
Idris or agda for type level goodies.
* something like JS backtick interpolation. Strings are hugely important in day-to-day coding for a lot of domains. Baked-in utf8 and Rune (utf32) would also be nice to have.
* Leading pipe in cases and `| foo | bar => expr` (maybe guards too, but they can be subject to abuse)
* Module Typeclasses which make it harder to create typeclasses everywhere like Haskell, but also does away with some ambiguities and the special case `eqtype` typeclass. SML has a way to add operators, but without typeclasses, it's pretty useless and unsafe. While we're improving modules, bake higher-order functors into them (they are already widely supported)
* Bake Concurrent ML into the official spec
As you can see, not too many things. In fact, about half of them (or more) are already supported in some SML implementations.
Honestly, all the "new" syntax/features in languages like Java, Swift, or C# just seem like attempts to kluge them one step closer to SML.
At least three active SML implementations are working on implementing the fairly recent Successor ML spec (HaMLet S, MLton, and SML/NJ), so while SML has been around for a while, it's also an active language that's still moving forward. (HaMLet S is more of an experimentation platform than a production implementation, but MLton and SML/NJ are solid industrial implementations.)