在 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/

10-12 17:38