我创建了一个concatenate/1
函数,它应该连接一个列表和原子列表:
concatenate(L)->
concatenate(L,[]).
concatenate([],R)->
reverse(R);
concatenate([H|T],R) when is_atom(H) ->
concatenate(T,[H|R]);
concatenate([[]|L],R)->
concatenate(L,R);
concatenate([[H|T]|L],R)->
concatenate([T|L],[H|R]).
然而我收到错误:
15> ml:concatenate([[1,2],4,[3,4,5],[5,6]]).
** exception error: no function clause matching
ml:concatenate([4,[3,4,5],[5,6]],[2,1]) (ml.erl, line 27)
我认为应匹配,因为第二个concatenate/2
子句。
请问,我在这里做错了什么?
答案 0 :(得分:1)
根据Viacheslav Kovalev的回答,鉴于我想在这里处理原子和数字,我提出了以下解决方案:
concatenate([],R)->
R;
concatenate([H|T],R) when not(is_list(H)) ->
reverse(concatenate(T,[H|R]));
concatenate([[]|L],R)->
concatenate(L,R);
concatenate([[H|T]|L],R)->
concatenate([T|L],[H|R]).
答案 1 :(得分:0)
在第二个子句中,您正在使用when is_atom(H)
guard,它无法匹配子句(因为在这种情况下H
是数字)。将其更改为when is_number(H)
。