That's basically case 1, right? The compiler knows which type is being used at each call site, so it can generate a separate function for each type in the union and eliminate the type check/dead branches.
I guess the exception would be if you have a non-homogenous array that you try to map over. In that case there's probably no way around boxing the values.
For consts and function arguments yes, I think. But you could have some mutable variable or field whose value depends on runtime state. In that case, you could have an actual polymorphic type.
I guess the exception would be if you have a non-homogenous array that you try to map over. In that case there's probably no way around boxing the values.