erlang - 异常错误:没有函数子句匹配

时间:2014-11-17 06:57:28

标签: function erlang pattern-matching

我创建了一个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子句。

请问,我在这里做错了什么?

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)