在 J 中,我们可以使用 "_
生成一个常量函数:
k100 =. 100"_
k200 =. 200"_
这些可以与其他动词一起用于动名词:
(+:`k100`k200`-:)`:0 [ 256
512 100 200 128
如何直接从数组创建动名词?
也就是说,我想定义
k
以便它产生一个常量动词的动名词,如下所示: gk =: k 100 200 NB. (or '100 200 k' if it needs to be an adverb.)
gk@.(0)''
100
gk@.(1)''
200
最佳答案
我同意 @eelvex 的说法,这闻起来像 XY Problem 。使用您的示例,您能否为我们提供一个用例,说明您为什么更喜欢编写
gk =: k 100 200 300
[email protected]''
100
[email protected]''
200
代替
GK =: 100 200 300
0 { GK
100
1 { GK
200
甚至
100*1+ 0
100
100*1+ 1
200
等等?
通常,使用连词 (
@.
) 而不是动词 ( {
) 会限制您的运行时灵活性并增加代码复杂性,因此如果可以的话,通常您更喜欢后者而不是前者。只有当您想产生非名词结果(即动词或其他连词或副词)或需要它们具有更高的约束力时才真正需要连词,但在您的情况下,因为您将名词作为输入并简单地生成它元素作为输出,我不认为需要连接,或者支付复杂性税的理由。取一个名词(数组)并产生一个名词结果是动词的存在理由和 J 代码中最常见的结构。
尽管如此,编写
k
并不难。 k=:[^:(__-:])L:_ 0" _1 0&({. __"_`'')
在这里,我们以一个示例动名词(常量动词的名词形式)作为模板,然后用我们希望常量函数产生的值替换空白(
__
)。基本上,我们为数组的每个项目制作一份 __"_
副本,并用该项目替换 __。所以 100 200 300
变成 (100"_)`(200"_)`(300"_)
: gk=:k 100 200 300
[email protected] ''
100
[email protected] ''
200
但同样,我不会推荐这种方法,除非您面临的问题无法用简单的动词解决,例如
{&100 200 300
或 (100 * 1 + ])
,或者使用动名词方法的 yield 超过了灵活性方面的成本、复杂性和清晰度。如果您更详细地描述您的具体问题,我们可以帮助您权衡这些选择。
关于j - 如何从 J 中的数组创建动名词?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21898628/