在J句中从二元解释为一元解释

时间:2017-07-04 00:56:47

标签: refactoring j

在努力混合搭配不同的阶段之后,我试图理解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,我应该坚持使用加盖的叉子,这也是有用的信息。)

2 个答案:

答案 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

>: @ ? @ $

出于同样的原因,我将#替换为$。当我在这种情况下看到#时,我会自动阅读""的元素数量,但也许只是我。