However, it's common to want to abstract a return type chosen by the implementationfrom the caller.
For instance, a function may produce a collection, but not want to reveal the details of exactly what kind of collection it is. This may be because the implementer wants to reserve the right to change the collection type in future versions, or because the implementation uses composed lazy
transforms and doesn't want to expose a long, brittle, confusing return type in its interface. At first, one might try to use an existential in this situation:
AnyCollection 을 사용해도 타입 관계 정보는 지워지기 때문에 value-level abstraction
implementaion이 type-level absratction 을 할수 있는 방법이 기존에는 없었다.