在努力混合搭配不同的阶段之后,我试图理解J中的构图。我想帮助在同一句话中切换monadic和dadadic短语。
我刚在J做了一个简单的骰子滚轮,作为一个例子:
d=.1+[:?[#]
4 d 6
2 3 1 1
8 d 12
10 2 11 11 5 11 1 10
这是一个链:“d是一个加上x次出现的(上限)卷”
但是,如果我想使用>:来增加(并跳过上限[:],以便在第一个分叉后“切换”到monadic解释怎么办? 它将显示为:“d是x次出现的递增滚动”。
这样的东西不起作用,即使它看起来我有正确的结构:
d=.>:&?[#]
d
>:&? ([ # ])
(如果这种做法违背了J,我应该坚持使用加盖的叉子,这也是有用的信息。)
答案 0 :(得分:4)
让我们看一个二元叉a(c d f h g)b
,其中c,d,f,g和h是动词,a和b是参数,它们被评估为:(a c b) d (a f b) h (a g b)
参数被二元地应用于奇数位置的动词(或尖齿c,f和g) - 这些结果从右到左二进制到偶数d和h。叉也可以是(v v v)或(n v v)的形式,其中v代表动词,n代表名词。在(n v v)的情况下,你只需得到n的值作为中间叉的左参数。
如果你看一下d=.1+[:?[#]
的原始定义,你可能会注意到它简化为带有五个叉(1 + [: ? #)
的二元叉,其中[ # ]
可以被#
替换为它是一个二元叉(见上面的定义)。
[:
(Cap)动词不会向?
的左参数返回任何值,这意味着?
在a # b
的结果上单独行动,这就是正确的+
的参数,其左参数为1
。
那么,关于如何摆脱[:
并使用>:
代替1 + ...
您还可以将([: f g)
写为f@:g
以取消上限,这意味着([: ? #)
变为?@:#
,现在因为您想将此结果提供给{ {1}}你可以通过以下任何一种方式做到这一点:
>:
希望这会有所帮助,这是一个关于如何评估货叉的一个很好的基本问题。您是否愿意使用 d1=.>:@:?@:#
d2=. [: >: ?@:#
4 d1 6
6 6 1 5
4 d2 6
2 3 4 5
8 d1 12
7 6 6 4 6 9 8 7
8 d2 12
2 10 10 9 8 12 4 3
或([: f g)
形式的作文。
答案 1 :(得分:4)
总结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
对这些内容的好评如here (compositions)和here (trains)。
通常动词有许多可能的形式。更复杂的是,你可以用不同的方式混合许多基元来实现相同的结果。
经验,风格,performance和其他此类因素会影响您将上述内容组合成动词的方式。
在这种特殊情况下,我会使用@ bob' d1
,因为我发现它更清楚:increase the roll of x copies of y
:
>: @ ? @ $
出于同样的原因,我将#
替换为$
。当我在这种情况下看到#
时,我会自动阅读""的元素数量,但也许只是我。