2016-02-18 1 views
3
import std.container: Array; 
import std.algorithm: map; 
import std.range: transposed; 
import std.stdio: writeln; 
Array!(Array!int) a; 
a.insertBack(Array!int(1,2,3)); 
a.insertBack(Array!int(4,5,6)); 
writeln(a[].map!((ref a) => a[]).transposed); 

Error: template std.range.transposed cannot deduce function from argument types !()(MapResult!(__lambda1, RangeT!(Array!(Array!int))))Преобразование массива! (Array! T) в диапазоне диапазонов

Я не совсем уверен, что здесь происходит, не это должно быть диапазон диапазонов? Почему не может D вывести тип?

Как бы преобразовать Array!(Array!T) в диапазон диапазонов?

ответ

2

Шаблон ограничение transposed заключается в следующем:

if (isForwardRange!RangeOfRanges && 
    isInputRange!(ElementType!RangeOfRanges) && 
    hasAssignableElements!RangeOfRanges) 

Мы можем использовать pragma(msg), чтобы выяснить, какие из этих ограничений не удается:

auto m = a[].map!((ref a) => a[]); 
pragma(msg, isForwardRange!(typeof(m))); 
pragma(msg, isInputRange!(ElementType!(typeof(m)))); 
pragma(msg, hasAssignableElements!(typeof(m))); 

Для меня, он печатает:

true 
true 
false 

Это означает, что диапазон не имеет assigna элементов.

Это, вероятно, потому, что Array «s opSlice не возвращает именующее выражение (в этом случае функция map может также возвращать именующее выражение), и нет никакого способа„Unmap“срез a[] в массив, чтобы поддержать назначение до a через Map.

В качестве обходного пути, вы можете использовать Array ломтиков:

Array!(int[]) a; 

a.insertBack([1,2,3]); 
a.insertBack([4,5,6]); 
writeln(a[].transposed); 
+1

'hasAssignableElements (TYPEOF (ы []))' 'урожайности true'!. Итак, разве это не ошибка «карты»? – sigod

 Смежные вопросы

  • Нет связанных вопросов^_^