[Python-ideas] [Wild Idea] Static Ducks

Steven D'Aprano steve at pearwood.info
Tue Sep 22 17:46:20 CEST 2009


On Wed, 23 Sep 2009 12:25:32 am Masklinn wrote:
> On 22 Sep 2009, at 15:16 , Steven D'Aprano wrote:
> > On Tue, 22 Sep 2009 01:05:41 pm Mathias Panzenböck wrote:
> >> I don't think this is a valid test to determine how a language is
> >> typed. Ok, C++ is more or less weakly typed (for other reasons),
> >> but I think you could write something similar in C#, too. And C#
> >> is strongly typed.
> >
> > Weak and strong typing are a matter of degree -- there's no
> > definitive test for "weak" vs "strong" typing, only degrees of
> > weakness. The classic test is whether you can add strings and ints
> > together, but of course that's only one possible test out of many.
>
> And it's a pretty bad one to boot: both Java and C# allow adding
> strings and ints (whether it's `3 + "5"` or `"5" + 3`) (in fact they
> allow adding *anything* to a string), but the operation is well
> defined: convert any non-string involved to a string (via #toString
> ()/.ToString()) and concatenate.

I don't see why you say it's a bad test. To me, it's a good test, and 
Java and C# pass it.

If you're only criterion is that an operation is well-defined, 
then "weak typing" becomes meaningless: I could define addition of 
dicts and strings to be the sum of the length of the dict with the 
number of hyphens in the string, and declare that 

{'foo':'a', 'bar':'b'} + "12-34-56-78-90"

returns 6, and by your criterion my language would be strongly typed. I 
think that makes a mockery of the whole concept.


[...]
> See above: C#, much like Java, also allows concatenating anything to
> strings, and implicitly convert non-strings to strings.

Which hints that (at least when it comes to strings) C# and Java are 
weakly typed and that people consider them "strongly typed" is a 
triumph of marketing over reality.

For any typed language, you ask how the language deals with operations 
on mixed types. If you have to explicitly convert the values to a 
common type, the language is strongly typed. If the language implicitly 
does the conversion for you, it is weakly typed. If, as is usually the 
case, the language does some conversions automatically, and others 
requires you to do explicitly, then the language combines some strong 
typing with some weak typing, and it becomes a matter of degree whether 
you call it strongly or weakly typed. If we insist in sticking every 
language in a binary state of "weak" or "strong", then we need a 
heuristic to decide. The heuristic in common use is to allow implicit 
numeric coercions in strongly typed languages, but usually not to allow 
implicit string to int conversions.

This heuristic is not arbitrary. Automatically converting ints to floats 
is mathematically reasonable, because we consider e.g. 3 and 3.0 to be 
the same number. But automatically converting strings to ints is 
somewhat dubious. Although the intent of "1"+1 may be obvious, what is 
the intent of "foo"+1? Should "foo" convert to 0, or should "foo" be 
treated equivalent to a 24-bit integer, or what? There's no objective 
reason for preferring one behaviour over another. The same applies 
for "1"&123 -- should we treat the int 123 as the string "123", or the 
string "\01\02\03", or what? Of course a language designer is free to 
arbitrarily choose one behaviour over the other, but that is weak 
typing.

"Strong typing" carries connotations of strength and security, and "weak 
typing" sounds soft and risky, but neither of these are necessarily 
correct. Perl is weakly typed but it's very hard to cause it to crash, 
while C++ is strongly typed but easy to cause it to core-dump. Neither 
strategy is objectively better than the other in *all* cases, although 
in my opinion strong typing is probably *usually* better.


-- 
Steven D'Aprano



More information about the Python-ideas mailing list