Как определить монадическую функцию для работы со списком в J? - PullRequest
2 голосов
/ 20 мая 2010

Допустим, у меня есть следующее J-выражение:

# 3 ((|=0:)#]) 1+i.1000

Это подсчитывает количество чисел от 1 до 1000, которые делятся на 3 и не математика.)

Допустим, для этого я определил монадическую функцию следующим образом:

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

Как я могу (а) переопределить эту функцию, чтобы взять список и вернуть список, или (б) заставить функцию работать со списком, как есть, без переопределения, возможно, с использованием некоторого наречия или другого метода? *

Ответы [ 2 ]

1 голос
/ 17 августа 2010

Я рекомендую гораздо более простой подход определения вашего глагола как нулевого ранга. Работая с предоставленным вами глаголом, вот простой способ сделать это:

   f =: monad define "0
# y ((|=0:)#]) 1+i.1000
)

   f 1 2 3
1000 500 333

Единственное изменение - это "0, добавленное после слова 'define'.

1 голос
/ 21 мая 2010

Это для (б) дела:

    (f@{. , $:@}.) ^: (0 < #) 1 2 3
1000 500 333
...