Imagine you're the language designer today. What should this code produce?

my $x = 1; my $y = 2; print $x + $y;

What should this code produce?

my $x = 'hello'; my $y = 'world'; print $x + $y;

Easy, right? It gets more fun:

my $x = '10'; my $y = '20'; print $x + $y;

How about:

my $x = '99'; my $y = 'bottles of root beer on the wall'; print $x + $y;

If I were cruel, I'd suggest an example such as:

my $x = 10; my $y = 0.10; print $x + $y;

After all, consistency is important.

Here's something even stranger:

my $x = (77, 'seventy seven')[rand 2]; my $y = (99, 'ninety nine')[rand 2]; print $x + $y;

If you object to non-deterministic static typing in tuples, consider:

my $x = readline(); my $y = 'is my extension'; print $x + $y;

Or:

my $x = readline(); my $y = 99; print $x + $y;

Or (because you can argue that simple variable interpolation is syntactic sugar for repeated string catenation):

my $x = readline(); my $y = readline(); print "#$x is $y's jersey number";

Or:

my $x = readline(); my $y = readline(); print $x + $y;

Without manifest typing, how do you design your language for the least amount of surprise in these cases? More importantly, after you give all of your answers, ask yourself "Why?" and don't stop with "Language X does it this way, which is obviously correct," as the designers of Language X had to ask these questions too.

(For bonus points, defend the thesis "Strings are obviously arrays of characters!" in light of the polymorphic overload of addition in the integer/rational case.)