Whoops! Thanks for the correction. My apologies. Well, one other possible explanation I can think of is that, if concatenation were to produce a mutable result then (for example) tolower(a~b) wouldn't compile, because the argument to tolower() needs to be invariant. That's kind of a lame argument though.