0

当奉承列表中的所有级别时,我们应该使用方括号:

q)b:(1 2;(3 4;5 6);7;8)
q)raze/[b]               / flatten all levels
1 2 3 4 5 6 7 8
q)raze/b
'/
  [0]  raze/b

但是为什么要强制使用raze/[b]for Converge 语法而不是 simpleraze/b呢?

  • 更新

为什么这种语法适用于k,例如,{x+y}/1 2 3但不适用q

我的假设是在使用/副词而不是%. 我认为在某些开发频道中可能会有关于它的讨论,但我目前在https://groups.google.com/forum/#!forum/shaktidb找到的只有 Shakti 讨论组,并且 kx.com 也关闭了下来社区维基,所以我不知道在哪里可以找到额外的信息 - 在这里询问

  • 更新2

/也很重载:请参阅(k虽然不是官方参考)https://github.com/JohnEarnest/ok/blob/gh-pages/docs/Manual.md#over - overfixedpoint和。和里面的差不多吧?但是为什么解释器在上下文中“禁止”语法- 是否有技术原因无法识别用户意图?forwhileqkqqk

4

2 回答 2

2

比如说,cos/1起作用k但不起作用的原因q是它q没有矛盾心理。也就是说,所有运算符都不会在化合价上重载,如q4mq中的第 6.1.2 节所述。

使用任何q's 副词(每个:',over:/scan:\,prior::,eachright:/:,eachleft:)\:,生成的导数函数被解释q为二元的,除非您使用 [] 专门传递一个参数。

对于上面的示例,q解释cos/do而不是收敛,因此需要左参数指定迭代次数(注意 、 、 等的0 cos/ 1结果1 cos/ 12 cos/ 1。解决的首选方法是使用 []'s: cos/[1]

(cos/) 1之所以有效,是因为用户定义的函数永远不能使用中缀表示法,因此表达式会自动解释为单子应用。这也是2 (cos/) 1失败的原因。要解决此问题,您将不得不再次使用 []'s: (cos/)[2;1]

于 2020-02-28T14:56:14.523 回答
2

您在这里不一定需要方括号。你可以使用

(raze/)b

如果您不想在b. 如果您没有指定累加器的初始值,则使用 over ( 或/) 的方式b需要括号括起来。raze/b这是因为 q 解释器需要知道您正在应用raze/到列表,b而不是/先应用到列表(这就是'/引发错误的原因)然后再应用到列表(raze从右到左读取代码)。

更多关于使用的信息/可以在这里找到:https ://code.kx.com/q4m3/6_Functions/#676-over-for-accumulation

于 2020-02-27T16:40:42.380 回答