// impl Type {
//     pub fn apply(self, to: impl Into<Box<Type>>) -> Self {
//         Type::Application(Box::new(self), to.into())
//     }
//     pub fn kind(&self) -> &Kind {
//         match self {
//             Type::Var(v) => &v.kind,
//             Type::Constructor(c) => &c.kind,
//             Type::Application(l, _) => {
//                 match l.kind() {
//                     Kind::Arrow(_, kind) => &*kind,
//                     _ => unreachable!(),
//                 }
//             }