如何定义一个monadic函数来处理J中的列表?

时间:2010-05-19 21:15:02

标签: j tacit-programming

假设我有以下J表达式:

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

这计算1到1000之间可被3整除的数字的数量。(现在,在任何人指出有更简单的方法可以做到这一点之前,这个问题是关于 J ,数学。)

假设我为此定义了一个monadic函数,如下所示:

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

这适用于单个参数,例如,

    f 4
250

如果我传入列表,我会收到长度错误:

    f 1 2 3
|length error: f

现在,我完全明白为什么我会得到长度错误。当您将列表1 2 3替换为monad的y参数时,您会得到:

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

如果您对J有所了解,那么很明显为什么会发生长度错误。所以,我不需要解释。

我想定义这个函数,当我传递一个列表时,它返回一个列表,例如,

   f 1 2 3
1000 500 333

我怎样才能(a)重新定义此函数以获取列表并返回列表或(b)使函数按原样处理列表而不重新定义,可能使用某些副词或其他技术?

2 个答案:

答案 0 :(得分:1)

这是针对(b)案例:

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

答案 1 :(得分:1)

我建议使用更简单的方法将动词定义为零等级。使用您提供的动词,这是一个简单的方法:

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

   f 1 2 3
1000 500 333

唯一的变化是在'define'之后添加了"0