Разница между каждым правом и каждым - PullRequest
0 голосов
/ 08 мая 2018

В KDB, почему я могу сделать это:

{[x;y]x+y} ./: enlist[(1;1);(2;1)]

, но не это:

{[x]x+1} ./: enlist[1;2]

, если я использую это:

{[x]x+1} each enlist[1;2]

Тогда этоработает.Почему 2 параметра имеют значение?

1 Ответ

0 голосов
/ 08 мая 2018

Я думаю, что здесь есть пара вещей, которые нужно объяснить, но не разница между каждым и каждым справа.

Ваш первый и второй примеры не совсем сопоставимы. С несколькими аргументами enlist возвращает один список, поэтому enlist[(1;1);(2;1)] возвращает общий список, а enlist[1;2] возвращает типизированный список (список длинных). Подробнее о enlist здесь .

Теперь одно из применений точки глагола - это multi -вариантное приложение, читайте здесь . Это означает, что он применяет к функции несколько аргументов, и поэтому . ожидает список. Каждый справа берет каждый элемент с правой стороны по очереди и передает его функции слева. Поскольку . ожидает список, но каждый элемент во второй строке имеет атомарную длину, он выдает ошибку типа.

Обновление второй строки, чтобы . получил список, как в первой строке ...

q){[x]x+1} ./: enlist[(1;2)] 'rank

На этот раз мы видим ошибку ранга, поскольку . пытается применить 2 аргумента к монадической функции. , Подобным образом;

q){[x]x+1}[1;2] 'rank

Чтобы это исправить, мы можем подключить. Таким образом, каждый справа передает 2, 1 список элементов в . вместо 1, 2 списка элементов.

q){[x]x+1} ./: enlist each (1;2) 2 3

...