3

假设我有以下 J 表达式:

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

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

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

f =:单子定义
# y ((|=0:)#]) 1+i.1000
)

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

    f 4
250

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

    f 1 2 3
|长度错误:f

现在,我完全理解了为什么会出现长度错误。当您将列表替换为monad1 2 3的参数时,您会得到:y

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

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

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

   f 1 2 3
1000 500 333

我怎样才能(a)重新定义这个函数来获取一个列表并返回一个列表,或者(b)让函数按原样在列表上工作而不被重新定义,也许使用一些副词或其他技术?

4

2 回答 2

2

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

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

   f 1 2 3
1000 500 333

唯一的变化是在"0“定义”一词之后添加。

于 2010-08-16T22:11:15.500 回答
1

这是针对 (b) 的情况:

    (f@{. , $:@}.) ^: (0 < #) 1 2 3
1000 500 333
于 2010-05-21T12:08:17.750 回答