Как определить монадическую функцию для работы со списком в J?

StackOverflow https://stackoverflow.com/questions/2869487

  •  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 добавлен после слова «определить».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top