Comment #0 by bearophile_hugs — 2014-11-04T10:53:56Z
This is wrong code:
class Foo {}
void main() {
import std.algorithm: all;
Foo[] data;
assert(data.all!(f => f != null));
}
DMD 2.067alpha gives:
test.d(5,16): Error: template std.algorithm.all cannot deduce function from argument types !((f) => f != null)(Foo[]), candidates are:
..\dmd2\src\phobos\std\algorithm.d(12251,1): std.algorithm.all(alias pred = "a")
The correct code needs "!is" instead of "!=":
assert(data.all!(f => f !is null));
The error message should tell me more precisely what's the problem.
Comment #1 by nick — 2018-06-23T13:27:33Z
Changing to phobos bug because `all`'s constraint uses:
is(typeof(unaryFun!pred(range.front)))
Instead this could be made a static assert, so at least the user can be informed that the predicate is not callable with Foo.
More phobos algorithm that use lambda must be chnaged, in the same fashion, before closing. Seb's PR was "just" a RFC.
Comment #5 by nick — 2023-03-11T15:15:51Z
static assert is an improvement over the constraint, but it still hides the actual error message which should be:
Error: use `!is` instead of `!=` when comparing with `null`
Removing the constraint allows the correct error to be seen. But then the constraint may be needed to disambiguate overloads. Without a compiler solution, we could have a new trait - __traits(canPass, pred, range.front) which ignores the body of pred:
https://forum.dlang.org/post/[email protected]
In the absence of that, the best I've come up with is:
if (__traits(isTemplate, pred) || is(typeof(pred(range.front))))
Which doesn't check that pred can take that argument when pred is a lambda, but it doesn't hide the actual error unlike the constraint status quo or the static assert way.
A compiler solution might not work in the presence of overloads, because currently failing constraints are only shown when there are no overloads.
Comment #6 by nick — 2023-03-11T15:19:05Z
> Without a compiler solution
BTW that would show the failing lambda with Phobos as is. The static assert PR discussion said a compiler solution is needed rather than having to update every template that accepts a lambda in Phobos.
Comment #7 by robert.schadek — 2024-12-01T16:22:52Z