> the different functions with the same name get merged together
What different functions? There's only one function given in your example, the
one defined by the type signature:
factorial :: (Integral a) => a -> a
Run
It's quite wrong to interpret
factorial 0 = 1
factorial n = n * factorial (n - 1)
Run
as function definitions--they are _patterns_ , very similar to
(a, b) = iReturnATuple()
Run
in Nim, which is a limited form of pattern matching.
> As others have already said, it's runtime polymorphism
Anyone who says that is quite wrong. It's no more "runtime polymorphism" than a
case statement is.