跳至主要内容

lambda

将输入步骤(或步骤数组,或无)作为第一个参数,回调作为第二个参数,并返回一个步骤,该步骤代表将每个值(或值数组,或无)通过给定回调后的结果。

回调应该执行计算,或者可以获取数据,但不能有副作用。如果您需要执行有副作用的操作,请改用 sideEffect()(它具有非常相似的 API)。

如果您 100% 确定您的回调函数

  1. 不执行任何异步工作(没有 promise),
  2. 没有副作用,
  3. 不会抛出错误

然后为了获得最佳性能,您可以将第三个参数 isSyncAndSafe 设为 true。除非您确定,否则不要这样做!

单依赖版本

function lambda<T, R>(
$input: ExecutableStep<T>,
callback: (input: T) => R | Promise<R>,
isSyncAndSafe = false,
): ExecutableStep<R>;

示例

// Takes a step representing a zero-based index, and converts it to a one-based
// index by adding one to it.
const $oneBased = lambda($zeroBased, (zeroBased) => zeroBased + 1, true);

无依赖版本

如果您的回调不需要任何输入,您可以传递 nullundefined 而不是步骤。

function lambda<R>(
$input: null | undefined,
callback: () => R | Promise<R>,
isSyncAndSafe = false,
): ExecutableStep<R>;

多依赖版本

如果您需要传递多个步骤,可以使用 list() 步骤来执行此操作:lambda(list([$a, $b, $c]), ([a, b, c]) => a + b + c)

如果您希望节省一些字符,可以直接传递步骤数组,我们会自动将其包装在 list() 中。

function lambda<Tuple extends [...any[]], R>(
// i.e. $input: ExecutableStep[],
$input: { [Index in keyof Tuple]: ExecutableStep<Tuple[Index]> },
callback: (input: Tuple) => R | Promise<R>,
isSyncAndSafe = false,
): ExecutableStep<R>;

示例

// Passing an array of steps gives you the values as an array:
const $aPlusB = lambda([$a, $b], ([a, b]) => a + b, true);

警告:没有批处理!

lambda 是一个逃生舱口,它使您摆脱 Grafast 的批处理;您应该只将其用于最简单的操作(即同步 JS 代码,不执行繁重的计算,并且不会从批处理中受益)。

在大多数情况下,您应该使用 loadOne。以下是上面示例使用 loadOne 的样子 - 请注意,这些回调现在一次性调用所有值,而不是一次调用一个值。

const $oneBasedIndex = loadOne($zeroBasedIndex, (allN) =>
allN.map((n) => n + 1),
);

const $aPlusB = loadOne(list([$a, $b]), (allAsAndBs) =>
allAsAndBs.map(([a, b]) => a + b),
);