q语言中将一元函数映射到列表时为何并非总是需要`each`关键字?
Q语言函数传入列表报错与正常执行的差异原因
第一个函数执行报错的原因
- 先计算核心变量的运算结果:
sums sells结果为2 6 9 11,是长度为4的整数列表sums buys结果为2 3 7 10 15 19,是长度为6的整数列表 - 函数
f:{x & (sums buys)}中的&是q语言的逐元素取最小值运算符,逐元素二元运算要求两个操作数满足以下两个条件之一:- 两者长度完全相等
- 其中一个操作数是原子(单个值),此时原子会自动广播为和另一个操作数相同长度的列表再运算
- 直接调用
f (sums sells)时,x是长度为4的列表,和长度为6的sums buys做逐元素运算时长度不匹配,因此抛出length错误。 - 调用
f each (sums sells)时,each迭代器会将sums sells中的每个原子(2、6、9、11)逐个传入f,每次调用x都是原子,会自动广播为长度6的列表和sums buys运算,每次返回长度为6的列表,最终4次调用拼接为4行6列的结果矩阵,和你得到的输出一致。
第二个函数正常执行的原因
函数{(x*x;x)}内部的*也是逐元素乘法,但运算的两个操作数都是x本身:当你传入长度为3的列表1 2 3时,x是长度3的列表,x*x的两个操作数长度完全匹配,运算后返回长度3的列表,最终返回两个长度3的列表组成的嵌套列表,不存在长度不匹配问题,因此可以正常执行。
两个函数虽然都是一元函数,但内部对输入参数的长度要求完全不同:f要求输入x是原子或者和
sums buys等长的列表,而第二个函数只要输入是任意长度的列表即可正常运算,这是两者表现不同的核心原因。
内容的提问来源于stack exchange,提问作者Chechy Levas
相关产品推荐
相关产品推荐

