| name | dolphindb-functional-programming |
| description | 在编写、优化、解释 DolphinDB / DolphinScript 代码时应用此函数式编程规则集。 适用于高阶函数、函数模式、函数运算符、链式表达、eachAt/at 映射调用、lambda、部分应用、动态函数调用、模块与函数视图相关任务。 当任务需要以函数为主要组织单位处理数据、组合函数或组织函数接口时使用。
|
DolphinDB 函数式编程
使用流程
按以下流程使用本 skill:
- 判断任务是否属于 DolphinDB / DolphinScript 函数式编程;若输入不是 DolphinDB 代码或相关设计问题,回复“请提供 DolphinDB 脚本或函数式编程设计上下文。”
- 明确函数类别、输入对象、输出形态和调用位置。
- 根据任务类型选择参考文件:
- 场景 01:函数作用在数据上
- 场景 02:函数作用在函数上
- 场景 03:函数作用在函数集合或接口上
- 按场景文件选择高阶函数、函数模式、部分应用、动态调用、模块或函数视图。
- 代码完成后,检查输出长度、对象维度、参数绑定顺序和副作用位置。
总规则
规则 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。
场景 02:函数作用在函数上
任务涉及 lambda、匿名函数、部分应用、函数对象传递、动态获取函数或动态生成函数调用代码时,阅读 references/scene-02-函数作用在函数上.md。
场景 03:函数作用在函数集合或接口上
任务涉及模块、函数视图、函数发布、命名空间、授权或跨节点复用时,阅读 references/scene-03-函数作用在函数集合或接口上.md。
参考文件
-
references/scene-01-函数作用在数据上.md
提供高阶函数、函数模式、函数模式叠用、映射调用、链式表达和典型数据处理案例。
-
references/scene-02-函数作用在函数上.md
提供 lambda、匿名函数、函数运算符、部分应用、动态函数调用和元编程案例。
-
references/scene-03-函数作用在函数集合或接口上.md
提供模块、函数视图及其适用边界。
输出要求
根据任务类型选择输出模式,输出内容保持简洁。
-
概念解释
输出至少包含:概念定义、与相近概念的区别、一个简短例子。
-
路线判断
输出至少包含:当前任务类别、推荐函数或函数模式、选择理由、仍需确认的前提。
-
代码改写
输出至少包含:当前写法的问题、推荐函数或函数模式、改写代码。若现有代码已经符合函数式组织方式,直接说明无需改写,并给出简短理由。
-
组织方式建议
输出至少包含:当前需求更适合模块还是函数视图、理由、部署或权限注意事项。