# Dolphindb Functional Programming

> 在编写、优化、解释 DolphinDB / DolphinScript 代码时应用此函数式编程规则集。 适用于高阶函数、函数模式、函数运算符、链式表达、eachAt/at 映射调用、lambda、部分应用、动态函数调用、模块与函数视图相关任务。 当任务需要以函数为主要组织单位处理数据、组合函数或组织函数接口时使用。

- Skill: `dolphindb/dolphindb-functional-programming` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add dolphindb/dolphindb-functional-programming`
- Raw SKILL.md: https://api.skillmd.com/api/skills/dolphindb/dolphindb-functional-programming/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: dolphindb (https://skillmd.com/u/dolphindb)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/dolphindb/dolphindb-functional-programming

---


# DolphinDB 函数式编程

## 使用流程

按以下流程使用本 skill：

1. 判断任务是否属于 DolphinDB / DolphinScript 函数式编程；若输入不是 DolphinDB 代码或相关设计问题，回复“请提供 DolphinDB 脚本或函数式编程设计上下文。”
2. 明确函数类别、输入对象、输出形态和调用位置。
3. 根据任务类型选择参考文件：
   - 场景 01：函数作用在数据上
   - 场景 02：函数作用在函数上
   - 场景 03：函数作用在函数集合或接口上
4. 按场景文件选择高阶函数、函数模式、部分应用、动态调用、模块或函数视图。
5. 代码完成后，检查输出长度、对象维度、参数绑定顺序和副作用位置。

## 总规则

### 规则 01：确定函数类别与默认输出形态

区分当前函数是标量函数、聚合函数还是向量函数，再判断它作用于向量、表、矩阵、元组、字典后的默认行为。`byRow`、`byColumn`、`each`、函数模式和其他承载入口，都应基于函数类别与输出形态选择。

- 标量函数：输出只依赖当前位置，作用到复杂对象时通常逐元素展开。
- 聚合函数：输入是一批数据，输出一个归约结果；作用到表和矩阵时，常见默认行为是按列聚合。
- 向量函数：输入和输出都保留序列结构，位置关系会影响结果，例如 `prev`、`cumsum`、`mavg`。

### 规则 02：优先采用内置入口、高阶函数和函数模式

内置函数通常已经定义对象级行为。自定义函数进入表、矩阵、窗口或分组对象时，应显式指定高阶函数或函数模式。编写自定义循环前，应检查是否已有现成入口。向量级自定义函数进入二维对象时，应明确采用按列还是按行应用。

### 规则 03：用链式表达呈现调用顺序

多步处理优先使用从左到右的链式表达，使调用顺序、书写顺序和阅读顺序一致。高阶函数嵌套过深时，优先改用函数模式，将高阶函数调用转为链式入口。

常用映射关系如下：

| 高阶函数 | 函数模式 | 作用 |
| --- | --- | --- |
| `each` | `:E` | 逐项遍历 |
| `loop` | `:U` | 逐项遍历并保留元组结果 |
| `eachLeft` | `:L` | 遍历左侧元素 |
| `eachRight` | `:R` | 遍历右侧元素 |
| `cross` | `:C` | 遍历左右组合 |
| `eachPre` | `:P` | 遍历当前元素和前一个元素 |
| `eachPost` | `:O` | 遍历当前元素和后一个元素 |
| `byRow` | `:H` | 按行处理 |
| `byColumn` | `:V` | 按列处理 |
| `accumulate` | `:A` | 输出每一步结果 |
| `reduce` | `:T` | 输出最终结果 |
| `groupby` | `:G` | 分组聚合计算 |
| `contextby` | `:X` | 分组向量计算 |

### 规则 04：默认保持无副作用函数风格

自定义函数参数默认不可修改。只有需要状态推进或原地修改时，才显式使用 `mutable`。涉及状态修改时，应说明状态对象的位置、生命周期，以及不能改写为无状态表达的原因。

### 规则 05：明确输入拆分方式与结果合并方式

选择 `each`、`byRow`、`byColumn`、`reduce`、`accumulate`、`groupby`、`contextby` 前，应明确输入对象如何拆分、每次调用接收什么参数、多个调用结果如何合并。

### 规则 06：区分终值输出与全路径输出

只需要最终结果时，优先选择 `reduce` 一类终值入口；需要保留每一步结果时，优先选择 `accumulate` 一类全路径入口。该判断直接影响函数选型和输出长度。

### 规则 07：检查函数运算符优先级

函数运算符与普通运算符的优先级不完全一致。`neg`、`not` 等函数运算符进入复合表达式时，应检查实际绑定关系。存在歧义时，改用链式表达或普通函数调用。

### 规则 08：按需求引入动态调用、模块和函数视图

`call`、`makeCall`、模块和函数视图分别解决动态调用、调用代码生成、函数集合复用、接口发布和权限控制问题。当前任务仅涉及局部表达式实现时，不应引入这些机制。

### 规则 09：区分映射调用中的逐维处理与整体处理

函数、字典、向量、矩阵和表都可以作为映射对象。`eachAt` / `@` 将多维索引中的每一维分别处理，`at` / `[]` 将索引整体处理。映射对象是函数时，`at` 等价于按实参集合调用函数；单个实参本身是元组时，需要用 `enlist` 包装。

### 规则 10：函数模式叠用按从左到右的顺序解释

一个函数同时带有多个函数模式时，按从左到右的顺序应用模式。修改模式顺序会改变任务拆分顺序、结果排列顺序和后续合并形态。涉及 `:L:R`、`:R:L`、`:E:E` 这类写法时，应单独说明每一层模式处理的对象。

## 场景划分

### 场景 01：函数作用在数据上

任务涉及批量元素处理、行列方向计算、递推过程、分组窗口或多步数据变换时，阅读 [references/scene-01-函数作用在数据上.md](references/scene-01-函数作用在数据上.md)。

### 场景 02：函数作用在函数上

任务涉及 lambda、匿名函数、部分应用、函数对象传递、动态获取函数或动态生成函数调用代码时，阅读 [references/scene-02-函数作用在函数上.md](references/scene-02-函数作用在函数上.md)。

### 场景 03：函数作用在函数集合或接口上

任务涉及模块、函数视图、函数发布、命名空间、授权或跨节点复用时，阅读 [references/scene-03-函数作用在函数集合或接口上.md](references/scene-03-函数作用在函数集合或接口上.md)。

## 参考文件

1. [references/scene-01-函数作用在数据上.md](references/scene-01-函数作用在数据上.md)  
   提供高阶函数、函数模式、函数模式叠用、映射调用、链式表达和典型数据处理案例。

2. [references/scene-02-函数作用在函数上.md](references/scene-02-函数作用在函数上.md)  
   提供 lambda、匿名函数、函数运算符、部分应用、动态函数调用和元编程案例。

3. [references/scene-03-函数作用在函数集合或接口上.md](references/scene-03-函数作用在函数集合或接口上.md)  
   提供模块、函数视图及其适用边界。

## 输出要求

根据任务类型选择输出模式，输出内容保持简洁。

1. 概念解释  
   输出至少包含：概念定义、与相近概念的区别、一个简短例子。

2. 路线判断  
   输出至少包含：当前任务类别、推荐函数或函数模式、选择理由、仍需确认的前提。

3. 代码改写  
   输出至少包含：当前写法的问题、推荐函数或函数模式、改写代码。若现有代码已经符合函数式组织方式，直接说明无需改写，并给出简短理由。

4. 组织方式建议  
   输出至少包含：当前需求更适合模块还是函数视图、理由、部署或权限注意事项。

