loop / ploop

语法

loop(func, args...)

参数

func 是一个函数。

args 是F的参数。

详情

loop 高阶函数与 each 高阶函数很相似,区别在于函数返回值的格式和类型。

对于 each 高阶函数来说,第一个函数调用的返回值数据格式和类型决定了所有函数的返回值数据格式和类型。

例子

$ x = each(call{, 3 4 5}, (log, sum));
$ x;
// log(3 4 5) 返回一个向量,sum(3 4 5)返回一个标量。系统将一个标量转换成一个向量。

log

sum

1.098612

12

1.386294

12

1.609438

12

$ typestr x[0];
FAST DOUBLE VECTOR

$ typestr x[1];
FAST DOUBLE VECTOR
// log(3 4 5) 返回DOUBLE向量,因此系统将sum(3 4 5)转换成一个DOUBLE向量。

$ each(call{, 3 4 5}, (sum, log));
The vector can't be converted to long scalar.
// sum(3 4 5)返回一个标量而log(3 4 5) 返回一个向量,系统无法将一个向量转换成一个标量。

相反,loop 没有这样的限制。它适用于函数返回值类型不同的情况。ploop 是相应的并行版本。关于并行函数调用请参考 分布式计算

下例中,loop 返回一个包含两种数据格式的元组:标量和向量。

$ loop(call{, 3 4 5}, (sum, log));
(12,[1.098612,1.386294,1.609438])
// call{,x} 是一个将另一个函数作为参数的部分应用。

$ loop(call{, 3 4 5}, (log, sum));
([1.098612,1.386294,1.609438],12)

下例中,loop 计算表中每一列中的最大值。

$ t = table(1 2 3 as id, 4 5 6 as value, `IBM`MSFT`GOOG as name);
$ t;

id

value

name

1

4

IBM

2

5

MSFT

3

6

GOOG

$ loop(max, t.values());
(3,6,"MSFT")

$ each(max, t.values());
Incompatible type. Expected: INT, Actual: STRING