а как обеспечивается что EvidenceA нельзя создать вне функции a?
В принципе тоже самое можно сделать и через обычные универсальные типы, но тогда сигнатура функции будет чуть другой:
fn f<A, B, E>(ev: E, a: impl Fn(E) -> A, b: impl Fn(A)
-> B): B
Тут опять из-за параметричности и не копируемости A, E и B тело у функции может быть только одно, а именно: b(a(ev))