F#中map结合fold/reduce的自定义函数应如何命名?
F# 函数命名方案
简单场景函数命名
你给出的简单示例函数逻辑为「先对输入集合的所有元素执行投影转换,再做折叠/归约计算」,避开已被占用的mapFold、MapReduce名称,推荐命名如下:
fooFold命名为projectFold:前缀project明确点明第一步执行投影操作,和F#内置的mapFold功能做清晰区分,无歧义。fooReduce命名为projectReduce:和projectFold命名风格统一,同时和分布式领域的MapReduce概念做切割,不会造成误解。
替换后调用示例符合直觉:
let minX, maxX = projectReduce fst min game, projectReduce fst max game let minY, maxY = projectReduce snd min game, projectReduce snd max game
分组计算场景函数命名
第二个复杂示例的函数逻辑为「先按指定键选择逻辑对集合分组,再对每个分组单独执行折叠/归约计算」,符合函数式编程领域通用命名习惯,推荐命名如下:
fooFold命名为foldByKey:沿用F#标准库xxxBy的命名风格(类似sortBy、groupBy),直接表达「按指定键分组后对每组做折叠」的逻辑。fooReduce命名为reduceByKey:如果你的代码库中存在无投影步骤的同功能重载,可以加后缀命名为projectReduceByKey做区分,否则直接用reduceByKey足够清晰。
替换后调用示例:
foldByKey (fun x -> x.state) (fun acc x -> acc + x.cost) 0M projects // val it : seq<string * decimal> = seq [("CA", 1200000M); ("IL", 2100000M)] reduceByKey (fun x -> x.state) (fun x -> x.cost) (+) projects // val it : seq<string * decimal> = seq [("CA", 1200000M); ("IL", 2100000M)]
这类命名也和常见大数据处理框架的同名函数逻辑对齐,有相关开发经验的开发者可以快速理解功能。
内容的提问来源于stack exchange,提问作者kaefer
相关产品推荐
相关产品推荐

