As a counter-example, see how cryptic and confusing implicit lifetimes of closures can be.
Without explicit type annotations, the correct lifetimes can only be picked by type inference, and Rust becomes super annoying when you get wrong lifetime defaults in closures and type inference doesn't guess what you mean:
Thanks sincerely for all your reply, which gave me a more comprehensive understanding of Rust's lifetimes! This is a great design, instead of a compromise.
I hope to use this question to inspire thinking about how to make the lifetime design better. Seems like I underestimated its complexity
Yes, and I think this topic has been brought up for quite a few times as well. I have always wanted to wrap up a PoC implementation but never had the time... (and not sure how to handle recursion.)