Lie said:
So basically they refused to satisfy everything that is still possible
individually but would conflict if done together.
I can't understand that.
x = 1
a = x + 1 << decides it's an int
No, so far a and x are both Num (indeterminate)
b = x + 1.0 << error? or redefine to be float?
This determines that a, b, and x are all floats. It's not "redefined"
since the types were unknown prior to this.
Actually, I'm slightly wrong, 1.0 is not a float, it's a "Fractional"
which is a narrower class than Num but it could still be Float, Double,
or Rational. Nums support addition, subtraction, multiplication, but
not necessarily division. So int/int is an error. Fractionals support
division.
c = x + 1 << would this cause error while it worked in line 2?
No, c is also a float (actually Fractional)
A slightly obfuscated example:
l = [1, 1.0, 1]
This is the same as l = [1.0, 1.0, 1.0]. In Haskell, all elements
of a list must have the same type, so the 1.0 determines that l is
a list of fractionals.
x = 1
for n in l:
c = x + n
Haskell does not have loops, but if it did, all these values would be
fractionals.