Proposal
Add higher-kinded inference variables to Rust for the sake of opaque type inference. Longterm this should also be really impactful when dealing with aliases in binders and closure signature inference.
What
A higher-kinded inference variable is a type-level function taking generic arguments as input and returning a generic arg. I am using the notation ?infer[T, U] to talk about the type-level function fn(T: Type, U: Type) -> Type. A type-level function in Rust just a higher-ranked definition: for<T, U> whatever or at an even more syntax level type Foo<T, U> = whatever.
I intend to use them to infer opaque types in their defining scope as the current implementation in the new solver is somewhat brittle.
The idea is that in the defining scope we put for<generic_args> opaque<generic_args> = ?infer[generic_args] in the environment.
Normalizing an opaque now checks whether the given opaque is in the current environment, and if so, returns the instantiated RHS. See https://rust-lang.zulipchat.com/#narrow/channel/144729-t-types/topic/higher-kinded.20inference.20and.20opaques/with/578882618 for how this should work in more detail.
References
Mentors or Reviewers
I intended to mentor and review this work.
Process
The main points of the Major Change Process are as follows:
You can read more about Major Change Proposals on forge.
Comments
This issue is not meant to be used for technical discussion. There is a Zulip stream for that. Use this issue to leave procedural comments, such as volunteering to review, indicating that you second the proposal (or third, etc), or raising a concern that you would like to be addressed.
Proposal
Add higher-kinded inference variables to Rust for the sake of opaque type inference. Longterm this should also be really impactful when dealing with aliases in binders and closure signature inference.
What
A higher-kinded inference variable is a type-level function taking generic arguments as input and returning a generic arg. I am using the notation
?infer[T, U]to talk about the type-level functionfn(T: Type, U: Type) -> Type. A type-level function in Rust just a higher-ranked definition:for<T, U> whateveror at an even more syntax leveltype Foo<T, U> = whatever.I intend to use them to infer opaque types in their defining scope as the current implementation in the new solver is somewhat brittle.
The idea is that in the defining scope we put
for<generic_args> opaque<generic_args> = ?infer[generic_args]in the environment.Normalizing an opaque now checks whether the given opaque is in the current environment, and if so, returns the instantiated RHS. See https://rust-lang.zulipchat.com/#narrow/channel/144729-t-types/topic/higher-kinded.20inference.20and.20opaques/with/578882618 for how this should work in more detail.
References
Mentors or Reviewers
I intended to mentor and review this work.
Process
The main points of the Major Change Process are as follows:
@rustbot second.-C flag, then full team check-off is required.@rfcbot fcp mergeon either the MCP or the PR.You can read more about Major Change Proposals on forge.
Comments
This issue is not meant to be used for technical discussion. There is a Zulip stream for that. Use this issue to leave procedural comments, such as volunteering to review, indicating that you second the proposal (or third, etc), or raising a concern that you would like to be addressed.