主体类型 在类型理论 类型系统有主体类型t当且仅当对于任意的类型环境A和表达式eA  e u都可以从t推导到u 例如λ演算λxx其主体类型tα  αα为类型变量类似Java或C的泛型类型变量若有Aλxx int  int令αint则可以从主体类型t具体化为int  int 类型系统希望具有主体类型因为它可以对表达式确定一种单一类型该单一类型可演化为该表达式的所有可能类型如果类型系统没有主体类型则一个表达式可能有多个互不兼容的类型类型推导倾向于推导主体类型 ML具有主体类型属性ML表达式可以通过合一求出主体类型该主体类型被HindleyMilner type inference英语HindleyMilner type inference算法用到然而一些ML的扩展如polymorphic recursion英语polymorphic recursion会令主体类型丧失undecidable其他一些扩展如Haskell的generalized algebraic data type英语generalized algebraic data type也令主体类型丧失destroy要么开发人员使用类型注解要么编译器猜测类型 主体类型与主体定型不同主体定型意思是对于表达式e类型环境A和类型t为主体定型对当且仅当对于任意的类型环境B和类型uAB有相同的变量都可从At推导到Bu该推导过程一般使用变量具体化和子类替换 一般来说有主体定型一定有主体类型反之则不成立例子是ML的let多态