>>3
I personally do not find writing side-effects, in Haskell, at least, to be “painful”. Perhaps you could provide an example of that. The question of whether Haskell can do common side-effectual operations like
PutStrLn "hi" or
hPutStr "GET / HTTP/1.1\r\n" or
launchMissiles is a bit silly. You
can write imperative code.
The “X by default with Y parts” argument with respect to side-effects is an interesting one. If you like writing really stateful code even in your simple algorithms, then fundamental, easy mutation of variables is useful. But if you prefer writing more mathematically styled, timeless code, it isn't very useful.
Let's consider an imperative language which allows guarantee of purity, given
sufficiently elegant means of expression for pure code (for example
map), I, personally, would write most of my code in a pure and functional way. (Indeed, most of the CPU time of Haskell programs is in pure functions. Unless you're working with OpenGL, most of your program will be pure code.) This would lead me to conclude that the language should be pure by default.
Perhaps you are different, perhaps you would really, really want mutation of variables and statefulness to write your algorithms with; then, I agree that you would want imperative by default. But I cannot agree that there is absolutely a better out of “X by default with Y parts” and “Y by default with X parts”. In conclusion, it is a personal choice. If you prefer X over Y, then have that as default, otherwise the opposite. At this time, I don't know whether having the “abstraction” of fundamental mutation is any better or worse, but I don't prefer it.