[swift-evolution] [Idea] Generic associated types

Karl Wagner razielim at gmail.com
Sun Apr 23 15:22:30 CDT 2017


> On 23 Apr 2017, at 19:58, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
> 
> 
> on Sat Mar 11 2017, Karl Wagner <swift-evolution at swift.org> wrote:
> 
>>> On 12 Mar 2017, at 06:51, Austin Zheng <austinzheng at gmail.com>
>> wrote:
>>> 
>>> I think you want higher-kinded
>>> types. https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#higher-kinded-types
>>> <https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#higher-kinded-types>
>> 
>>> 
>>> Best,
>>> Austin
>>> 
>>>> On Mar 11, 2017, at 9:49 PM, Karl Wagner via swift-evolution
>>>> <swift-evolution at swift.org
>>>> <mailto:swift-evolution at swift.org>>
>>>> wrote:
>>>> 
>>>> I have a model like this:
>>>> 
>>>> protocol Promise {
>>>>    associatedtype Result
>>>> }
>>>> 
>>>> protocol Scanner {
>>>>    associatedtype ScanPromise: Promise
>>>> 
>>>>    func promiseScan<T>(from: Offset, until: (Offset, Item) -> T?) -> ScanPromise // where Result == T?
>>>> }
>>>> 
>>>> The thing that I’m trying to express is: whichever type implements
>>>> the associated type ‘ScanPromise’ must be generic, and that
>>>> parameter must be its result (i.e. something it got as a result of
>>>> calling the “until” closure).
>>>> 
>>>> Even with SE-0142, this kind of constraint would not be possible. What I would like to write is something like this:
>>>> 
>>>> protocol Promise {
>>>>    associatedtype Result
>>>> }
>>>> 
>>>> protocol Scanner {
>>>>    associatedtype ScanPromise<T>: Promise // now generic. [SE-0142]: where Result == T
>>>> 
>>>>    func promiseScan<T>(from: Offset, until: (Offset, Item) -> T?) -> ScanPromise<T>
>>>> }
>>>> 
>>>> Thoughts?
>>>> 
>>>> - Karl
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution at swift.org
>>>> <mailto:swift-evolution at swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>> 
>> 
>> Not necessarily. Higher-kinded types (IIUC) are per-instance -
>> e.g. every instance of a Collection could have a unique type of Index.
> 
> No, that's “dependent types.”  Austin had it right.
> 
> -- 
> -Dave
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

Ah, well I learned something today.

- Karl


More information about the swift-evolution mailing list