> 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.