代码之家  ›  专栏  ›  技术社区  ›  dukereg

J句从二元到一元的转换

  •  3
  • dukereg  · 技术社区  · 7 年前

    在努力混合和匹配不同的阶段后,我试图理解J中的构图。我想帮助在同一个句子中切换一元短语和二元短语。

    我刚刚在J中制作了一个简单的骰子滚轮,这将作为一个示例:

       d=.1+[:?[#]
       4 d 6
    2 3 1 1
       8 d 12
    10 2 11 11 5 11 1 10
    

    但是如果我想使用>:增加(并跳过cap[:),以便在第一个分叉之后“切换”到一元解释?

    尽管在我看来它的结构是正确的,但这样的东西是行不通的:

       d=.>:&?[#]
       d
    >:&? ([ # ])
    

    (如果这种方法与J相反,我应该坚持使用带帽叉子,这也是有用的信息。)

    2 回复  |  直到 7 年前
        1
  •  4
  •   bob    7 年前

    让我们来看一个并矢叉 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)

    如果你看一下你最初对 d=.1+[:?[#] 你可能会注意到它简化为一个五齿并矢叉 (1 + [: ? #) 其中 [ # ] # 因为它是一个并矢叉(见上面的定义)。

    [: ? ? 根据以下结果单独行动: a # b 这是正确的论点 + 1 .

    那么,关于如何摆脱 [: >: 1 + ...

    你也可以写 ([: f g) f@:g ([: ? #) 变成 ?@:# >: 您可以通过以下任一方式实现:

       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
    

    构图形式。

        2
  •  4
  •   Eelvex    7 年前

    总结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 还有其他这些因素会影响你将上述内容组合成动词的方式。

    d1 因为我觉得读起来更清楚: increase the roll of x copies of y :

    >: @ ? @ $
    

    出于同样的原因,我正在替换 # 具有 $ #