在努力混合和匹配不同的阶段之后,我试图理解 J 中的构图。我需要帮助在同一个句子中的一元短语和二元短语之间切换。
我刚刚用J做了一个简单的骰子滚轮,作为例子:
d=.1+[:?[#]
4 d 6
2 3 1 1
8 d 12
10 2 11 11 5 11 1 10
Run Code Online (Sandbox Code Playgroud)
这是一条链:“d 是 1 加上 x 出现的 y 的(上限)卷”
但是,如果我想使用 >: 来递增(并跳过上限 [: ),以便它在第一个分叉后“切换”为单子解释,该怎么办?其内容为:“d 是 y 出现 x 的增量”。
像这样的东西是行不通的,尽管在我看来它具有正确的结构:
d=.>:&?[#]
d
>:&? ([ # ])
Run Code Online (Sandbox Code Playgroud)
(如果这种方法不适合 J,并且我应该坚持使用有盖的叉子,这也是有用的信息。)
总结一下J中动词混合的主要简单模式:
(f @: g) y = f (g y) NB. (1) monadic "at"
x (f @: g) y = f (x g y) NB. (2) dyadic "at"
x (f &: g) y = (g x) f (g y) NB. (3) "appose"
(f g h) y = (f y) g (h y) NB. (4) monadic fork
x (f g h) y = (x f y) g (x h y) NB. (5) dyadic fork
(f g) y = y f (g y) NB. (6) monadic hook
x (f g) y = x f (g y) NB. (7) dyadic hook
Run Code Online (Sandbox Code Playgroud)
通常动词有多种可能的形式。让事情变得更加复杂的是,您可以以不同的方式混合许多基元来实现相同的结果。
经验、风格、表现和其他此类因素会影响您将上述内容组合起来形成动词的方式。
在这种特殊情况下,我会使用@bob's,d1因为我发现它读起来更清晰increase the roll of x copies of y::
>: @ ? @ $
Run Code Online (Sandbox Code Playgroud)
出于同样的原因,我将替换#为$. 当我看到#这种情况时,我会自动阅读“元素的数量”,但也许这只是我的想法。