For type inference, it's not so much that a function's return type is unknown -- rather, think of it as not known YET. The function's type signature should initially be stated in terms of type variables, and the relevant constraints should be generated. During the unification step, the type variables should then be determined. If the function's type signature is still in terms of undetermined type variables, it's polymorphic.
For "built-in" polymorphic operators, they too have specific type signatures. It's just that these may be in terms of type variables. Specifically, the type signature for first is list(alpha) -> alpha. That's not the same as unknown. The type variable alpha will be figured out from how it's used. Lists in type inference systems are homogenous, so they can't quite contain anything.