Как определить монадическую функцию для работы со списком в J?
-
03-10-2019 - |
Вопрос
Допустим, у меня есть следующее выражение J:
# 3 ((|=0:)#]) 1+i.1000
При этом подсчитывается количество чисел от 1 до 1000, которые делятся на 3 без остатка.(Теперь, прежде чем кто-нибудь укажет, что есть более простой способ сделать это, этот вопрос касается синтаксис J, и нет математика.)
Допустим, я определяю для этого монадическую функцию следующим образом:
f =: monad define # y ((|=0:)#]) 1+i.1000 )
Это отлично работает с одним аргументом, например,
f 4 250
Если я передам список, я получу ошибку длины:
f 1 2 3 |length error: f
Теперь я полностью понимаю, почему получаю ошибку длины.Когда вы заменяете список 1 2 3
для y
аргумент монады, вы получите:
# 1 2 3 ((|=0:)#]) 1+i.1000
Если вы знаете что-нибудь о J, вам будет совершенно ясно, почему возникает ошибка длины.Так что мне не нужны объяснения этого.
Я хочу определить функцию так, чтобы при передаче списка она возвращала список, например:
f 1 2 3 1000 500 333
Как я могу либо (а) переопределить эту функцию, чтобы она принимала список и возвращала список, либо (б) заставить функцию работать со списком как есть, без переопределения, возможно, с использованием какого-либо наречия или другого метода?
Решение
Это для случая (б):
(f@{. , $:@}.) ^: (0 < #) 1 2 3
1000 500 333
Другие советы
Я рекомендую гораздо более простой подход: определить глагол как нулевой ранг.Работая с предоставленным вами глаголом, вот простой способ сделать это:
f =: monad define "0
# y ((|=0:)#]) 1+i.1000
)
f 1 2 3
1000 500 333
Единственное изменение заключается в "0
добавлен после слова «определить».