[swift-evolution] union types
Drew Crawford
drew at sealedabstract.com
Fri Dec 11 18:18:31 CST 2015
> How do you expect people will use the result of such an operation in practice? The type being 'Any' makes it completely opaque.
> If your library is a high-level one, I definitely wouldn't want to see it return 'Any' from Socket methods. Instead, a library should erase the differences between transport mechanisms in the high-level API, while still providing a low-level API for those who need it, as well as for the implementation of the high-level API.
Perhaps it would be better to recursively unify parameters/returns into their own unions, such that
final class Socket {
func getsockname() -> union(Any, [sockaddr_in, sockaddr_in6])
}
> Did you look at AnySequence and other related types that implement a similar pattern manually?
AnySequence has a different motivation. In AnySequence, the underlying type is fully erased, or alternately, the underlying type is an element from an open set. This is appropriate for a public API where the user may create their own types unknown to the library author which need to be erased.
In a union, the underlying type is only partially erased, or alternately, the underlying type is an element from a closed enumeration. This is appropriate for a private/internal API where the types are known at compile time.
I suspect it would be difficult to automatically unify an *open* set of types, which is why AnySequence et al are manually maintained. But unifying a *closed* set of types can be implemented in a preprocessor. So unification is much more appropriate in this case.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20151211/82d9d812/attachment.html>
More information about the swift-evolution
mailing list