On Friday, 12 January 2018 at 10:53:04 UTC, Seb wrote:
canFind uses find internally, which already has a shortcut for SortedRange. I don't like contains either, but the idea was to have a separate method with different performance guarantees as canFind is typically O(n).
Anyways I have tried to deprecate it:

https://github.com/dlang/phobos/pull/5651

Maybe you have better arguments?

Ah I see. Nah I don't have better arguments :p Think yours were good enough. If I understood correctly the argument to keeping contains is because it means "here is a function that searches logarithmically"? Is that correct? While I do agree "contains" indicates some kind of quick(er) check functionality over an algorithm with the word find in it, I can't quite elaborate why that's the case, but I think it only applies when there's context, and not "generically", and because I've used hash maps a lot. The problem is that it's not enforceable and hence cannot be depended upon, so I don't think it's a good argument in the current scenario. A better convention would be to have the indiction of complexity explicitly in the name, i.e. name it "locagirhtmicFind" or "binarySearch", etc, and have that on a SortedRange. But I assume that ship has sailed...

Tried looking for other languages which differentiate between find/search/exists/contains/etc based on complexity and I don't think there are any? Are there?

Swift does "contains"
C++ does "find"
Rust does "contains" (and find??)
Julia does "searchsorted"

None of them make any complexity promises, the only one I can look at and would be surprised if it didn't do a faster search is the Julia one.


----

Now to your main question:

Exposing doesn't help much, because you can't compare them, but there is WIP on lambda comparisons:

https://github.com/dlang/dmd/pull/7484

With it, the default lamdas can be compared for equality and what you want to do can/will be done.

Aha ok so basically you're saying that even if pred was public then I can't make sure R1.pred == R2.pred so it does't make it a 100% guarantee right? But regardless of that wouldn't making pred public be needed to do the above anyway? I.e. if an algorithm wants to make sure the SortedRange preds were the same it still needs to access them right? And if the algorithms are single ranged, then you don't need to compare any lambdas then - i.e. canFind just uses whatever pred was in SortedRange.

Or did I maybe misunderstand?

Cheers

Reply via email to