【发布时间】:2014-01-26 20:02:48
【问题描述】:
为什么我们不能计算两个不可变范围的笛卡尔积?
以下代码:
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
此外,如果第二个但第一个不可变被删除,它就可以工作。
根据 phobos 实现,范围之一是 inputRange,另一个是 forwardRange。为什么会有这样的模板约束?
【问题讨论】:
-
请注意,人们通常想要的是不可变成员的可变数组,例如
immutable(int)[]。immutable int[]等价于immutable(int[]),比第一种限制更多。不能说它适用于您的问题,尤其是因为它不能解决问题。