Странная ошибка длины при определении соединения в J
Я играю с наречиями и соединениями в J, и натолкнулся на странную проблему. Я определил простое наречие под названием persistence
это может использоваться для просмотра последовательности чисел, сгенерированных при расчете цифрового продукта или цифровой суммы числа.
S =: 1 : 'u/@:("."0)@":^:a:"0'
+ S 234
дает нам 234 9
, Затем я использовал это, чтобы создать другое наречие, которое вычисляет постоянство числа.
P =: 1 : '<:@#@(u S)"0'
+ P 234
дает нам 1
, Теперь представьте, что мы хотим найти все числа ниже 30 с аддитивным постоянством 2, а затем просмотреть список, сгенерированный S
для каждого номера, например,
+ S I. 2 = + P i.30
Это создает следующий список:
19 10 1
28 10 1
29 11 2
Все идет нормально. Теперь я хотел взять это и превратить в соединение, в левой части которого содержится глагол для сохранения, а в правой части - число, используемое для ограничения списка. (2
в приведенном выше примере.) Вот мое определение этого соединения:
Q =: 2 : 'u S I. n = u P'
Если я введу выражение + Q 2
в консоль J я получаю следующее:
+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0
Это совершенно правильно, и если я запусту полное выражение с аргументом, таким как i.30
работает нормально:
+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0 i.30
Тем не менее, когда я ввожу выражение + Q 2 i.30
в консоль J я получаю "ошибку длины". Зачем?! не + Q 2
в точности эквивалентно +/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0
?
Я полностью в тупике. Что мне не хватает? Я играл с рангом как внутри определения соединения, так и вне его. Я просто не понимаю
1 ответ
+ Q 2
в точности соответствует предоставленному вами выражению, но при использовании его в выражении оно выглядит так, как если бы оно было в скобках.
+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0 i.30
19 10 1
28 10 1
29 11 2
(+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0) i.30
|length error
В общем f g h y
знак равно (f g h) y
, В последнем f g h
определяет поезд. Например:
avg=: +/ % #
+/ % # 1 2 3
0.333333
(+/ % #) 1 2 3
2
avg 1 2 3
2
Вы можете исправить свое соединение, добавив к нему ссылку на y следующим образом:
Q=: 2 : 'u S I. n = u P y'
+ Q 2 i.30
19 10 1
28 10 1
29 11 2