V Tue, 29 Dec 2015 17:42:26 +0000 Alex Parrill via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> napsáno:
> On Tuesday, 29 December 2015 at 09:26:31 UTC, Alex wrote: > > The problem is, that the last line with the reduce does not > > compile. Why? > > If you get an error, it is imperative that you tell us what it is. > > For the record, this code: > > import std.bitmanip; > import std.stdio; > import std.algorithm; > > void main() { > > BitArray[] arr7 = [BitArray([0, 1, 0, 1, 0, 1]), > BitArray([0, 1, 0, 0, 0, 0]), BitArray([0, 1, 0, 1, 0, 0]), > BitArray([0, 1, 0, 1, 0, 0])]; > > BitArray common = BitArray([1,1,1,1,1,1]); > foreach(BitArray ba; arr7) > { > common &= ba; > } > writeln("common2: ", common); > > writeln("common1: ", reduce!((a,b) => a & b)(arr7)); > } > > Gives me the error: > > /opt/compilers/dmd2/include/std/algorithm/iteration.d(2570): > Error: variable f868.main.F!(__lambda1).e cannot be declared to > be a function > /opt/compilers/dmd2/include/std/meta.d(546): Error: template > instance f868.main.F!(__lambda1) error instantiating > /opt/compilers/dmd2/include/std/algorithm/iteration.d(2477): > instantiated from here: staticMap!(ReduceSeedType, __lambda1) > /d486/f868.d(16): instantiated from here: > reduce!(BitArray[]) > /d486/f868.d(16): Error: template std.algorithm.iteration.reduce > cannot deduce function from argument types !((a, b) => a & > b)(BitArray[]), candidates are: > /opt/compilers/dmd2/include/std/algorithm/iteration.d(2451): > std.algorithm.iteration.reduce(fun...) if (fun.length >= 1) > > On 2.069.1 (dpaste: http://dpaste.dzfl.pl/8d7652e7ebeb). I don't > have time ATM to diagnose it further. It definitely shouldn't be > that cryptic of an error message. It is cause by this https://dlang.org/phobos/std_bitmanip.html#.BitArray.init So until it will be removed it will does not compile. Problem is in https://dlang.org/phobos/std_range_primitives.html#.ElementType which is implementet as template ElementType(R) { static if (is(typeof(R.init.front.init) T)) alias ElementType = T; else alias ElementType = void; } maybe rewriting this like: template ElementType(R) { static if (is(typeof(R.init.front) T)) alias ElementType = T; else alias ElementType = void; } could help too