Ответ заключается в изучении данных, которые вы извлекаете для присоединения, здесь оператор -3!
- ваш друг, который поможет выявить фактическую структуру через несколько слоев набора
q)d:((1 2 3;4 5 6 7);(8 9;10;11 12);(13 14;15 16 17 18;19 20))
q)i1:(2 0; 0 1 0)
q)i2:(1 0; 0 1 0)
q)y:(100 200 300; 400 500 600)
q)-3!r1:.[d; i1]
"((13 14;15 16 17 18;13 14);(1 2 3;4 5 6 7;1 2 3))"
q)q){type each x} each .[d; i1]
7 7 7
7 7 7
q)-3!r2:.[d; i2]
"((8 9;10;8 9);(1 2 3;4 5 6 7;1 2 3))"
q){type each x} each .[d; i2]
7 -7 7
7 7 7
Нет, здесь мы можем видеть что в первом случае каждый элемент r1
представляет собой список списков, но для r2
первый элемент представляет собой 2 списка длинных с атомом c long 10
.
Из документации по сечению
Форма у равна 2 3, такая же форма, как у сечения, выбранного с помощью d. i
т. е. Shape должен соответствовать количеству и типам, тип каждого элемента y равен 7h, что должно соответствовать типу каждого выбора из d.
По существу, когда вы используете операторы поправок ,
и @
, он будет ожидать соответствия, так как использует поправку на месте. a:1;a,:1 2 3
также не удастся.
Мы можем подтвердить это другими вашими примерами
q)type @[(1; (),2; 3);1]
7h
Изменение этого примера для настройки первого элемента
q)@[(1; (),2; 3);0;,;10]
'type
Причина, по которой просто используется оператор ,
поскольку 10,((),200)
не вызвало каких-либо ошибок, это потому, что вы используете его за пределами корректирующих перегрузок, в рамках корректирующей перегрузки ,
ожидает, что будет работать с соответствующей формой. При непосредственном использовании он может продвигать и корректировать форму.