Are type variables really only used in mathematical conversation about types? i.e. are type variables (metavariables that only contain the type classification label) only exist in proofs for types but not in real programming languages? At least is this true for monomorphic types? i.e. I can’t actually define:
$ $ \texttt{ let id x = x }: \tau$ $
unless the type $ \tau$ has already been defined or is built in? i.e. type variables only exist for symbolic manipulation of type proofs for humans (at least for monomorphism).
Extra thoughts:
I am trying to understand how one defines the identity function $ \texttt{let id x = x}$ in monomorphic type systems. I believe the motivation for polymorphism is to allow to apply the same syntactic definition of a function to different data types that are NOT the same, like: $ \texttt{id 2}$ and $ \texttt{id true}$ without the type checker freaking out at us when it tries to run those (if the language is dynamically typed…I guess in static the compiler would complain at the first instance of the identity function being applied to the wrong type when we try to compile it to usable code).
So to my understanding, if we define types as a set of possible data values, so say $ \texttt{int}$ defines the set of all integers. Then the set $ Set_{int \to int}$ is the set of all functions that can map integers to integers. But if we have $ Set_{\forall \alpha . \alpha \to \alpha}$ and we consider the identity function corresponding to both sets so $ id_{\forall \alpha . \alpha \to \alpha} \in Set_{\forall \alpha . \alpha \to \alpha}$ and $ id_{int} \in Set_{int \to int}$ then when both identity functions are applied to integers they will behave exactly the same BUT they are not the same function (because they are not the same data value, the data value for one is identity on only integers while the other is give me any type and I will act like its corresponding identity. So in particular $ Set_{\alpha \to \alpha} = Set_{int \to int} \cup \dots \cup Set_{string \to string}$ (i.e. the identity $ id_{\alpha \to \alpha}$ is just the identity function for a specific type but not actually a function that is able to process ANY type, its one and in this case this is why the for all is important).
So my question is, is $ id_{\forall \alpha . \alpha \to \alpha} \in Set_{\alpha \to \alpha}$ ? I guess I am trying to clarify the dots … What does it cover? Perhaps it depends on the context of how the types are formally defined? If the $ \alpha$ stands for type variables, but type variables are only allowed to be monomorphic by definition (i.e. say the type constructor for the metalangauge is recursive but only in the monomorphism where we can’t introduce the forall quantifier) then the $ id_{\forall \alpha . \alpha \to \alpha} \not\in Set_{\alpha \to \alpha}$ . But if the recursive definition for polymorphic types is recursive at the polymorphic step then perhaps $ id_{\forall \alpha . \alpha \to \alpha} \in Set_{\alpha \to \alpha}$ is true? Actually I don’t think so…
Context: CS 421
Related:

What does $ \forall \alpha_1, \dots , \alpha_n . \tau $ mean formally as a type?

What is the difference between $ \alpha \to \alpha $ vs $ \forall \alpha. \alpha \to \alpha$ ?