Note that the inline curry almost works: let add = |x| move |y| x + y; is pefectly correct. Iff x is obviously used by move, then the move annotation for the inner closure isn’t required.
That said, a proposal to add first class currying syntax would have to explain how currying benefits Rust. I personally find a more explicit curried style, with fn add(x, y) and when I want to “curry it” I do |y| add(my_x, y), to be unintrusive and very obvious as to what’s going on.
Return position impl Trait also makes the stable syntax honestly very close to the ideal, while exposing the costs quite clearly. Honestly, the only sugar I’d add is inlining the parameter names to the header to avoid separating them from their types like what a heavily curried function would look like on stable:
fn foo(a: A) -> impl FnOnce(B) -> impl FnOnce(C) -> impl FnOnce(D) -> impl FnOnce(E) -> F {
|b| |c| |d| |e| {
// "actual" fn body
unimplemented!()
}
}