想象一下,我在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 )
答案 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倍)。