如何在J中定义一个动词,它将不同的动词交替应用于列表中的每个原子?

时间:2010-06-07 10:09:53

标签: tacit-programming j

想象一下,我在J中定义了以下名称:

m =: >: i. 2 4 5

如下所示:

 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15
16 17 18 19 20

21 22 23 24 25
26 27 28 29 30
31 32 33 34 35
36 37 38 39 40

我想创建一个等级1的monadic动词,它适用于此列表列表中的每个列表。它将加倍(+:)或将1(>:)添加到列表中的每个备用项。如果我们将此动词应用于第一行,我们将获得2 3 6 5 10

获取与每个项目交替的布尔值列表相当容易,例如0 1 $~{:$ m给我们0 1 0 1 0。我想,啊哈!我会使用像+:`>: @.这样的东西,然后是一些表达式,但我永远无法让它发挥作用。

有什么建议吗?

更新

以下似乎可行,但也许它可以被J专业人士重构为更优雅的东西。

poop =: monad define
    (($ y) $ 0 1 $~{:$ y) ((]+:)`(]>:) @. [)"0 y
)

3 个答案:

答案 0 :(得分:2)

我会使用倾斜动词,等级为1(/."1) - 所以它依次适用于每个列表的连续元素。

你可以将一个动名词传递给/.并按顺序应用它们,并循环延伸。

   +:`>: /."1 m 
 2
 3
 6
 5
10

12
 8
16
10
20

22
13
26
15
30

32
18
36
20
40


42
23
46
25
50

52
28
56
30
60

62
33
66
35
70

72
38
76
40
80

答案 1 :(得分:1)

我花了很长时间看着它,我相信我知道为什么,@能够恢复论证的形状。

带括号的短语的参数的形状是右边传递给它的参数的形状,即使等级被"共轭改变了(好吧,这就是跟踪所谓的,我以为这是一个副词)。如果,是monadic,则它将是一个ravel,并且结果将是一个向量或至少比输入更低的等级,基于ravel的副词。如果你把连接拿出来就会发生这种情况 - 你得到了一个向量。

所以我认为正在发生的事情是,,使,像一个二元$,"0@(+:一样被称为追加。附加内容会改变附加内容的附加内容。除了那个东西还有一个形状之外什么都没有,所以它最终会将中间向量改回输入的形状。

现在我可能错了。但是{{1}}>:/。)“1>:i.2 4 5 - > 2 4 5 1 1`我认为这有点证明了我的理由。

答案 2 :(得分:1)

(,@(+:`>:/。)" 1 a)有效,但请注意((* 2 1 $〜$)@(+ 0 1 $〜$)" 1 a)也可以工作(在大型阵列上,在我的简短测试中,速度提高约20倍)。