On Sunday, 13 December 2015 at 00:02:11 UTC, cym13 wrote:

Now that I think about it, it's true that it would make no sense whatsoever to return a range as reduce is typically used to return a single value... At least it makes perfect sense.

Thanks alot, this helped alot. But I have another question

I have two functions:

int[] prim_factors(int n, const ref int[] P){
        
        int[] v;
        
        for(int i; P[i]*P[i]<=n;++i){
                while(n%P[i]==0){
                        v~=P[i];
                        n/=P[i];
                }
        }
        if(n>1)
                v~=n;
                
        return v.dup.sort.uniq.array;

}


int product(const ref int[] arr){

        int p = 1;
        foreach(i;arr)
                p*=i;
        return p;
}

While vector P contains some primes I get with a prime sieve. So if I just try to use those functions like:

writeln(product(prim_factors(10,P)));

I get the error:

function prog.product (ref const(int[]) arr) is not callable using argument types (int[])

Why do I have to call it like that first:

        auto v = prim_factors(10,P);
        writeln(product(v));

?

Reply via email to