I've wondered before whether there's a fundamental difference between "carried" effects like async
/try
and "erasable" ones like const
/unsafe
. I can totally imagine how polymorphism for the latter might work, but I have no idea how to abstract away differences like for_each
vs try_for_each
...