型レベルで表現しておいて、型パラメータとかに突っ込んでもっと複雑な型状態が作れたり。 勘で書いたので適当。

Type-level sum

enumの型レベル表現的なもの

enum Alphabets {
    A,
    B,
}
struct A;
struct B;

pub(crate) mod sealaed {
    pub trait Alphabets {}
}

impl sealed::Alphabets for A {}
impl sealed::Alphabets for B {}

sealaed traitにすることで、このtraitをimplできなくなる。はず

Type-level product

structの型レベル表現的なもの

struct AlphabetsPair {
    x: Alphabets,
    y: Alphabets,
}

let a_and_b = AlphabetsPair {
    x: Alphabets::A,
    y: Alphabets::B,
};
trait AlphabetsPair {
    type X: Alphabets;
    type Y: Alphabets;
}

struct AandB {}
impl AlphabetsPair for AandB {
    type X = A;
    type Y = B;
}

fn test() {
    dbg!(std::any::type_name::<<AandB as AlphabetsPair>::X>()); // A
}