2

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

m =: >: 一世。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 的一元动词,该动词适用于此列表列表中的每个列表。它将加倍 ( +:) 或将 1 ( >:) 添加到列表中的每个备用项目。如果我们将此动词应用于第一行,我们会得到2 3 6 5 10.

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

有什么建议么?

更新

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

便便 =:单子定义
    (($ y) $ 0 1 $~{:$ y) ((]+:)`(]>:) @.[)"0 y
)
4

3 回答 3

3

我会使用等级为 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
于 2010-06-12T05:31:01.240 回答
1

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

括号中的短语的参数的形状是右边传递给它的参数的形状,即使等级被"共轭改变了(嗯,这就是跟踪所说的,我认为它是一个副词)。如果,是 monadic,它将是一个 ravel,结果将是一个向量,或者至少比输入的等级低,基于副词 to ravel。如果你把连词去掉,就会发生这种情况——你得到一个向量。

所以我相信正在发生的事情是连词使,行为像一个,被称为附加的二元。追加改变了它正在追加的内容。它没有附加任何东西,但那个东西仍然具有形状,因此它最终将中间向量更改回输入的形状。

现在我可能错了。但是$,"0@(+:>:/.)"1 >: i. 2 4 5 -> 2 4 5 1 1` 我认为这证明了我的情况。

于 2011-09-15T22:06:32.087 回答
1

(,@(+:`>:/.)"1 a) 有效,但请注意 ((* 2 1 $~ $)@(+ 0 1 $~ $)"1 a) 也有效(并且是在我的简短测试中,在大型阵列上大约快 20 倍)。

于 2013-01-16T20:23:06.703 回答