[swift-evolution] [Proposal draft] Enhanced floating-point protocols

davesweeris at mac.com davesweeris at mac.com
Wed Apr 20 16:23:46 CDT 2016


> On Apr 20, 2016, at 1:15 PM, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
> 
> 
> on Tue Apr 19 2016, Thorsten Seitz <swift-evolution at swift.org> wrote:
> 
>> I'd like to have something like Summable with 'add', 'adding' and 'zero' being a
>> separate protocol as well as somthing like Multiplicative with 'multiply',
>> 'multiplied' and 'one' being a separate protocol, because these are universally
>> interesting for other cases, e.g. Summable would be useful for defining path
>> lengths in a graph library.
>> 
>> Would you mind adding that to the proposal?
> 
> I suspect you may be headed into the realm of
> protocols-as-bags-of-syntax.
You say that like it’s a bad thing… Am I missing the point? (NOT a rhetorical question)

Speaking only for myself, I want stuff broken up into many simpler protocols (which `Arithmetic` and such conform to) because there are many algorithms which only require small parts of the larger protocol. What if I wanted to add a function that sums all the elements in a collection?
extension CollectionType where Generator.Element: Arithmetic {
    func sum() -> Generator.Element {
        var s = Generator.Element()
        for e in self {
            s.add(e)
        }
        return s
    }
}

Yeah, it works, but if I want to get the sum of a collection of some custom type, I have to implement *all* of `Arithmetic`, as opposed to just the two parts of it (`init()` and `.add(:)`) that the algorithm actually uses. It’d be both simpler for the users and *more to the point of the function*, if it could be written like this:
extension CollectionType where Generator.Element: Addable { // "Addable" instead of "Arithmetic"
    ... // No change here
}

Now, if Swift allowed you to add protocol conformance to protocols:
protocol Addable {
    ... // Relevant subset of `Arithmetic`
}
#for T in Arithmetic { // "#for" because this is clearly macro-ish, and # seems to be what we've settled on for that
    extension T : Addable {} // Don't need anything here since `Arithmetic` already has everything in `Addable`
}
… then this all becomes a somewhat moot point. If some generic function only needs a subset of a protocol’s functionality, said function’s author could do this “#for T …” song & dance, and their function would be defined with the minimum constraints.


> Look at pages 14 and 24 of
> <http://www.cs.indiana.edu/pub/techreports/TR638.pdf>—which does the job
> right for C++—and you'll see why.
COOL!!! Thanks for posting that, it looks like it’ll be a great read! :-D

- Dave Sweeris
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160420/ee1b8ba6/attachment.html>


More information about the swift-evolution mailing list