Erlang累加器串行实现:自定义结合交换算子的列表运算方法开发
实现满足结合律交换律算子的通用归约函数
嘿,我懂你要做的这个通用运算方法——不管是加法、字符串拼接这类满足结合律和交换律的操作,都能把传入的算子应用到整个值列表上,最终返回运算结果对吧?结合你给出的示例,我来帮你补全并完善代码:
-module(tester). -export([sum/2]). % 处理空列表的情况,这里我们抛出异常提示,也可以根据需求返回对应算子的单位元(比如加法返回0,字符串拼接返回"") sum(_Op, []) -> error(empty_list); % 非空列表时,用foldl从左到右应用算子累加结果 sum(Op, [Head | Tail]) -> lists:foldl(Op, Head, Tail).
测试你的示例
- 加法运算测试:
输入:
tester:sum(fun(A,B) -> A+B end, [2,6,7,10,12])
输出:37 - 字符串拼接测试:
输入:
tester:sum(fun(A,B) -> A++B end, ["C", "D", "E"])
输出:"CDE"
额外优化建议
如果想支持空列表的场景,你可以扩展函数,让调用者传入对应算子的单位元,这样更灵活:
-module(tester). -export([sum/2, sum/3]). % 原有的二元函数,要求列表非空 sum(_Op, []) -> error(empty_list); sum(Op, [Head | Tail]) -> lists:foldl(Op, Head, Tail). % 新增三元函数,支持空列表,传入单位元 sum(Op, List, Identity) -> lists:foldl(Op, Identity, List).
比如空列表加法可以这么调用:tester:sum(fun(A,B) -> A+B end, [], 0),返回0;空列表字符串拼接调用tester:sum(fun(A,B) -> A++B end, [], ""),返回""。
因为你的算子满足结合律和交换律,不管用foldl还是foldr结果都是一致的,甚至可以扩展成并行处理的版本,不过上面的实现已经能完美覆盖你给出的需求啦。
内容的提问来源于stack exchange,提问作者reverb1010
相关产品推荐
相关产品推荐

