Is Scala really more complicated than Java?
artima.com
artima.com
I've heard this many times. I think learning some formal type theory might help. It worked for me, helping me get my head around Haskell and make sense of type error messages.
The evident difficulty the general programming public has had getting to grips with even this topic would make me pessimistic as to the efficacy of your advice.
Working through Pierce's book "Types And Programming Languages" (aka TAPL) is more what I had in mind. It is very clearly written and not that difficult(I have no formal Computer Science education and had no trouble with the book).
Monads aren't really very difficult when learned from the Type Theory perspective (vs from weird essays comparing them to elephants, space stations and so on).
I was specifically addressing this bit.
" but it is a headache to figure out _why_ it causes problems in the cases when type inference doesn't work as intended"
In my experience, knowing basic type theory helps this "figuring out" process.
'would make me pessimistic as to the efficacy of your advice.'
Fair Enough! I just posted what worked for me. YMMV :-)
" then as I pointed out, Scala is more complex than Java."
I didn't comment (either way) on this.
I was just trying to say learning type theory worked well for me when I was learning languages with powerful type systems (Haskell in my case), especially in understanding type errors. It may or may not work for you. It is just an experience report/suggestion.
I don't care if Scala is more complex than Java or not. Apologies if you thought I was making a claim to that effect.
Loosely speaking, a c-like English would be: "For each tree in the grove, paint on the stem"
But what would a Scala-like sentence be??? "trees in the grove - paint circles on their stems"???
"For every cookie in the jar; I ate that cookie" vs. "I ate all the cookies from the cookie jar" vs. "The cookie jar is empty"
(the last one assumes that the cookie jar was type-safe and contained nothing but cookies)
I haven't used Scala, but it's certainly a more general rule. Prolog or Make, for example, are damn simple once you understand the model they're based on - they're just fundamentally different from (say) Java or Python. Make has a reputation of being weird and complicated* because people assume its complexity adds to whatever model they're familiar with, but actually it replaces it entirely. Once you understand make's underlying model, everything you need to know to use it would comfortably fit on one page.
* Except the GNU make extensions added to bend gmake into a more 'conventional' tool / make it work with the autotools. The original, non-GNU make is vastly simpler. (Same with gawk vs. regular awk.)
2.8 is supposed to improve both, I think.
The type inference is local (and unification based), and not Hindley-Milner (ML). I'm pretty sure Scala's type inference is more complicated (and less awesome as a result).
print """
Happy Birthday To You
Happy Birthday To You
Happy Birthday Dear XXX
Happy Birthday To You
"""print"""Happy Birthday To You\nHappy Birthday To You\nHappy Birthday Dear XXX\nHappy Birthday To You""" -> 103 chars
This came up on the Clojure mailing list:
(dotimes[x 4](println"Happy Birthday"({2"Dear XXX"}x"To You"))) -> 63 chars
40 less characters.
I don't know Scala, but it is my understanding that it provides all of Java's functionality (possibly with different syntax) for the purpose of interoperation, as well as its own features. If that's true, then the language is more complicated than Java, even if the code you actually write is not.
Especially in things like Scala; ':=' for assignment is from Pascal, and Ocaml, to me, feels like a really verbose Lisp.
Programmers are much less likely to pick up a new tool if its syntax is so radically different from what they normally work with that there's a steep learning curve just to become accustomed to it.
Sure, both languages have some interesting features, but there really isn't anything driving the change beyond that. Scala lacks a decent web application framework (Lift is rubbish, I'm sorry), and they seem to be targeting that space. OCaml is interesting, but I don't see any major new technology driving its adoption.
Bit surprised you think Lisp is more dense. I just wrote a Lisp compiler in Lisp, and found it more verbose than ML (although only by a little bit). I find the lack of syntax in Lisp very annoying, particularly since it's not necessary -- you can write macros over an AST, which is how camlp4 works.
Could you elaborate?
For instance, in python I'm not usually tempted to put ';' at the end of a statement, except on lines with function calls. For some weird reason that f(x); goes completely automatic.
And every time I see my fingers do that I have to remove it again, and plenty of times I simply miss it.
It's like a violin that you've gotten used to over the years, the next violin may be a very good instrument but it will never be the one that you have this finely tuned connection with that you built up over the years. That takes years!
PS. I'm much happier now that python had replaced C++ as my primary language :)
I am asking this, because just looking at this snippet, I had no problem understanding it in a glance (which rates it as not complex), given that I know and was reminded of haskells and pythons list-comprehensions, a rubys block-structure and printf (don't hit me if these things are entirely different in scala, but this is how I just read it, and apparently, it was close enough to understand what this snippet does).