You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:24:14