2014-01-26 3 views
1

두 가지 불변 범위의 직교 곱을 계산할 수없는 이유는 무엇입니까?불변 범위의 데카르트 곱

다음 코드

import std.stdio; 
import std.algorithm; 

void main() { 

    immutable int[] B = [ 1, 2, 3 ]; 
    immutable int[] C = [ 4, 5, 6 ]; 
    auto BC = cartesianProduct(B, C); 

    writeln(BC); 
} 

예외 : 제 하지만 불변 제가 제거되면

/usr/include/dmd/phobos/std/range.d(4199): Error: cannot modify struct result._ranges_field_1 Repeat!(immutable(int)) with immutable members 
/usr/include/dmd/phobos/std/range.d(4503): Error: template instance std.range.Zip!(immutable(int)[], Repeat!(immutable(int))) error instantiating 
/usr/include/dmd/phobos/std/algorithm.d(11674):  instantiated from here: zip!(immutable(int)[], Repeat!(immutable(int))) 
laurent_test.d(8):  instantiated from here: cartesianProduct!(immutable(int)[], immutable(int)[]) 
/usr/include/dmd/phobos/std/algorithm.d(11674): Error: template instance std.range.zip!(immutable(int)[], Repeat!(immutable(int))) error instantiating 
laurent_test.d(8):  instantiated from here: cartesianProduct!(immutable(int)[], immutable(int)[]) 
laurent_test.d(8): Error: template instance std.algorithm.cartesianProduct!(immutable(int)[], immutable(int)[]) error instantiating 

Futhermore, 그것은 작동한다.

phobos 구현에 따르면, inputRange와 forwardRange가되는 범위 중 하나입니다. 그러한 템플릿 제약이 왜 필요한가?

+0

사람들이 종종 의도하는 것은 변경 불가능한 멤버의 변경 가능한 배열입니다. '불변 (int) []'. 'immutable int []'는'immutable (int [])'과 동일합니다. 이것은 첫 번째 타입보다 더 제한적입니다. 특히 문제가 해결되지 않아서 문제에 적용된다고 말할 수 없습니다. –

답변

2

저는 확실히 D의 전문가는 아니지만 작년에 similar question에게 물었습니다.이 answer from Jonathan M Davis은 우수했습니다.

TL; DR :

R r = void;  // can define a range object 
if (r.empty) {} // can test for empty 
r.popFront();  // can invoke popFront() 
auto h = r.front; // can get the front of the range 

당신이 culprint를 추측 할 수 : 그것은 4 개의 규칙을 존중 would't 때문에 범위는 불변이 될 수없는 이유는 무엇입니까? popFront

+0

실제로 정적 어설 션 (isForwardRange! (typeof (B)))이 실패했습니다. – matovitch

+0

죄송합니다. 모든 것을 이해하지 못하기 때문에이 대답을 수락하지 않습니다. 예를 들어, Unqual 템플릿을 사용하기 때문에 chain() 함수가 작동합니다. Cartesian 제품을 계산하는 것은 popFront가 필요하지 않습니까? 왜 우리는 입력과 포워드 범위가 필요한가? – matovitch

+2

그래, 난 여기에 문제가 있다고 생각하지 않는다. 심지어 최상위 레벨을 제거해야하는 명시 적으로 슬라이스를 적용해도 작동하지 않는다. 여기에 어딘가에 보이는 것은 내부적으로 타입에 할당하려고 시도하는 것입니다. 구현에 잠복 버그가되어 가고 있지만 아직 소스를 확인하지 않았습니다. –