Lack of monads is not a super huge pain point, but GATs do solve a big pain point: they're needed in order to have async methods.
To be clear here, you don’t need to write any of this stuff in the blog post to write an async method, but the desugaring of an async method involves GATs, so the language has to have them.
Lifetimes do not influence code generation (besides potential specialization on 'static, which I'm not sure if it's a thing).
But besides that the amount work is indeed very close by each other. Which is why there is currently no plan to first have lifetime only GATs stable as far as I know.
Because to have lifetime only GATs you need to change the syntax and liftime checker but once you checked the type
you can treat it ignoring lifetimes and in turn ignoring the GAT aspect.
But then if you did so you probably already implemented most/all of the code to typecheck non lifetime GATs and then doing the rest proper is probably not to hard either and might be not harder then doing liftime only GATs.
> You cannot specialize on lifetimes, it is not sound.
Good to know, given that specialization was stuck in nightly in the last years I didn't use it and in turn didn't look to much into it.
To be clear here, you don’t need to write any of this stuff in the blog post to write an async method, but the desugaring of an async method involves GATs, so the language has to have them.