Erlang如何将两个列表合并为元组列表及同名函数定义报错解决
问题解决方法
一、报错原因分析
- 核心原因:同一个Erlang函数的不同子句之间需要用分号
;分隔,只有最后一个子句结束时才用句号.。你原代码中第一个make_tuple_list子句结尾用了句号,编译器会判定该函数已经定义完成,后续再出现同名同元数的函数定义自然会报重复定义错误。 - 附加语法问题:模块属性
- module(test).中减号和module之间不能有空格,正确写法为-module(test).,不符合规范的属性定义会引发连锁语法解析错误。 - 冗余代码问题:第一个子句中
[_ | _] = [{H1, H2} | make_tuple_list(T1, T2)]是完全不必要的写法,你直接返回构造的列表即可,不需要额外做非空列表匹配。
二、正确实现方案
方案1:调用标准库函数(推荐)
Erlang标准库lists模块内置的zip/2函数刚好满足你的需求,可以直接用来合并两个等长列表为元组列表,不需要自行实现递归:
1> A = [1,2,3,4], B = ["A1", "A2", "A3", "A4"]. [1,2,3,4], ["A1","A2","A3","A4"] 2> lists:zip(A,B). [{1,"A1"},{2,"A2"},{3,"A3"},{4,"A4"}]
方案2:自定义递归实现
如果需要自行实现递归逻辑,修正后的完整代码如下:
-module(test). -export([start/0, make_tuple_list/2]). start() -> Abc = [2,3,1,4], Bbc = ["f1", "f2", "f3", f4], ct:pal("Hello ~n"), ct:pal("make_tuple_list ~p~n", [make_tuple_list(Abc,Bbc)]). make_tuple_list([H1 | T1], [H2 | T2]) -> [{H1, H2} | make_tuple_list(T1, T2)]; make_tuple_list([], []) -> [].
说明
以上两种实现都仅支持两个输入列表长度相等的场景,如果输入列表长度不一致会触发函数匹配报错,和标准库lists:zip/2的默认行为一致。
内容的提问来源于stack exchange,提问作者Zaro
相关产品推荐
相关产品推荐

