在J中,我们可以"_用来产生一个常数函数:
k100 =. 100"_
k200 =. 200"_
Run Code Online (Sandbox Code Playgroud)
这些可用于与其他动词的动名词:
(+:`k100`k200`-:)`:0 [ 256
512 100 200 128
Run Code Online (Sandbox Code Playgroud)
如何直接从数组创建动名词?
也就是说,我想定义k它以产生一个常量动词的动名词,如下所示:
gk =: k 100 200 NB. (or '100 200 k' if it needs to be an adverb.)
gk@.(0)''
100
gk@.(1)''
200
Run Code Online (Sandbox Code Playgroud)
我同意@eelvex这闻起来像是一个XY问题.使用您的示例,您能否为我们提供一个用例,说明您更喜欢写作的原因
gk =: k 100 200 300
gk@.0''
100
gk@.1''
200
Run Code Online (Sandbox Code Playgroud)
代替
GK =: 100 200 300
0 { GK
100
1 { GK
200
Run Code Online (Sandbox Code Playgroud)
甚至
100*1+ 0
100
100*1+ 1
200
Run Code Online (Sandbox Code Playgroud)
等等?
通常,使用连接(@.)而不是动词({)会限制您的运行时灵活性并增加代码复杂性,因此通常您更喜欢后者,如果您能够获得它.
只有当你想要产生非名词结果(即动词或其他连词或副词)或者你需要更高的约束力时,才真正需要连词,但在你的情况下,因为你将名词作为输入而只是生成它作为输出的元素,我没有看到需要结合,或者支付复杂税的理由.取名词(数组)并产生名词结果是动词的存在理由和J代码中最常见的结构.
尽管如此,写起来并不难k.
k=:[^:(__-:])L:_ 0" _1 0&({. __"_`'')
Run Code Online (Sandbox Code Playgroud)
在这里,我们将样本gerund(常量动词的名词形式)作为模板,然后将空白(the __)替换为我们希望我们的常量函数生成的值.基本上,我们__"_为数组的每个项目制作一个副本,并将__替换为该项目.所以100 200 300变成(100"_)`(200"_)`(300"_):
gk=:k 100 200 300
gk@.0 ''
100
gk@.1 ''
200
Run Code Online (Sandbox Code Playgroud)
但同样,我不推荐这种方法,除非你所面临的问题不能通过一个简单的动词解决,例如{&100 200 300或者(100 * 1 + ]),或者使用动名词方法的收益大于抵消灵活性,复杂性方面的成本,清晰度.
如果您更详细地描述您的具体问题,我们可以帮助您权衡这些选择.
| 归档时间: |
|
| 查看次数: |
207 次 |
| 最近记录: |