At least for const if you want to be able to reuse any of the standard library traits, you’ll need some form of const polymorphism a la:
const? fn foo<I>(iter: I) -> usize
where I: const? Iterator<Item = usize> {
iter.sum()
}
This is a syntactically lightweight way of saying that foo(iter) is const if all the methods of <I as Iterator> are const, otherwise foo(iter) is not const. I think it is quite important to be syntactically lightweight here.
I’m not sure why that would be the case… elaborate?
This assumes that one application is reusing both async and sync versions or const and non-const versions. If you only monomorphize to async, then you get zero extra overhead. The great benefit of polymorphism is that you can write libraries which can be customized to the needs of the application, and so you don’t need two libraries, or even more when you get more effects.
This seems plausible for effects (or restrictions) such as const, total, nopanic, unsafe (these would all be built-in), but implausible for async as the latter must generate different code. So it could be beneficial to denote per effect it if should participate in monomorphization or not with a default that it should. Given that the former set of effects are built-in, the non-monomorphization property for those effects could also just be built-in. Note: I’m speculating wildly here.
Truth be told, my main concern is const 
That said, that post does not seem very relevant to a strongly and statically typed language which is principled about effects. If you are using the “io” effect and then explicitly decide what handler to instantiate, then are you “releasing Zalgo”?