> On Feb 21, 2017, at 8:57 PM, Michel Fortin via swift-evolution > <swift-evolution@swift.org> wrote: > > (this was accidentally sent off-list, reposting here a day later)
And this was my reply. > >> Le 20 févr. 2017 à 12:17, Matthew Johnson <matt...@anandabits.com> a écrit : >> >>> e) Generic Containers: >>> Generic containers that impose requirements on their elements will pose >>> some additional problems, for instance: `Set.insert` needs to call >>> `hashValue` and `==` on its elements, making the purity of `Set.insert` >>> constrained by the purity of those functions. Without a way to express this >>> kind of conditional purity, `Set` and `Dictionary` cannot be pure. >> >> Could we use a mechanism similar to `rethrows` to address this kind of >> transitive purity? We have already discussed something along those lines >> for handling functions passed as arguments. Maybe that mechanism could be >> designed to handle this use case as well. > > Similar, yes. But more complicated too. In pseudo code, this is what you'd > have to express for `Set.insert`: > > pure(where: Element.hashValue is pure, Element.== is pure) > func insert(_ element: Element) { ... } > > Then the compiler can enforce that `insert` only does things that are allowed > in a pure function, but can ignore the purity of Element.hashValue and > Element.== because the caller will check for that that. Yep, that’s the kind of thing I had in mind. I can imagine being this explicit could get pretty cumbersome though. I wonder if there is a way to streamline this. For example, in this case if we could just talk about `Element`’s conformance to `Hashable` and we could talk about a `pure` conformance (all requirements are met with pure implementations) then we could just say something like this: pure(Element.Hashable) func insert(_ element: Element) { ... } Note: I also removed some redundancies - we could just say that the parameters are a list of things the purity of which `insert`’s purity depends. For function arguments it would look something like this: pure(transform) func map<T>(transform: Element -> T) > > -- > Michel Fortin > https://michelf.ca > > _______________________________________________ > swift-evolution mailing list > swift-evolution@swift.org > https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution