2014-08-30 2 views
8

의사 코드의이 조각으로 감소 잘 작동합니다 : 사실D : 대표

RANGE.reduce!((a,b) => a + b); 

는 여러 예제 및 문서에 나타납니다.

그러나이 작동하지 않습니다, 그리고 왜 알아낼 수 없습니다 : 나는 D에 버그가 될 줄 알았는데

algorithm.d(52,52): Error: cannot implicitly convert expression 
    (__lambda1(result, _param_1.front())) 
    of type int delegate() nothrow @nogc @safe 
    to int 

: 나는 다음과 같은 오류가 계속

RANGE.reduce!((a,b) => { return a + b; }); 

,하지만 아마도 나는 뭔가를 놓쳤습니다 ...?

(내 실제 대리인은 더 복잡합니다. 코드를 문제를 나타내는 최소한의 예제로 줄였습니다.)

답변

12

(a, b) => { return a + b; }을 사용하면 람다는 작동/위임을 반환하는 함수/위임이며 a + b 작업의 결과는 아닙니다. => 람다 연산자없이 (a, b) { return a + b; }을 사용해야 원하는 동작을 수행 할 수 있습니다.

이 다음 코드를 사용하여 볼 수 있습니다 :

pragma(msg, typeof((int a, int b) => a + b).stringof); 
// prints "int function(int a, int b) pure nothrow @safe" 

pragma(msg, typeof((int a, int b) => {return a + b;}).stringof); 
// prints "int delegate() nothrow @safe function(int a, int b) pure nothrow @safe" 

pragma(msg, typeof((int a, int b) { return a + b; }).stringof); 
// prints "int function(int a, int b) pure nothrow @safe" 

그래서 코드가 있어야한다 RANGE.reduce!((a, b) { return a + b; })을;