在编写、优化、解释 DolphinDB / DolphinScript 代码时应用此函数式编程规则集。 适用于高阶函数、函数模式、函数运算符、链式表达、eachAt/at 映射调用、lambda、部分应用、动态函数调用、模块与函数视图相关任务。 当任务需要以函数为主要组织单位处理数据、组合函数或组织函数接口时使用。
Scanned 9/6/2026
Install to Claude Code
npx -y skills add dolphindb/DolphinX_Skill --skill dolphindb-functional-programming --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Dolphindb Functional Programming?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/dolphindb-dolphindb-functional-programming)More formats (shields.io, HTML) on the badges page.
---
name: dolphindb-functional-programming
description: >
在编写、优化、解释 DolphinDB / DolphinScript 代码时应用此函数式编程规则集。
适用于高阶函数、函数模式、函数运算符、链式表达、eachAt/at 映射调用、lambda、部分应用、动态函数调用、模块与函数视图相关任务。
当任务需要以函数为主要组织单位处理数据、组合函数或组织函数接口时使用。
---
# 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. 组织方式建议
输出至少包含:当前需求更适合模块还是函数视图、理由、部署或权限注意事项。
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!