2014-11-17 71 views
0

我已经创建了一个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

什么是你想实现什么?这里有两个正交的问题编纂在一起:列表形成和条件检查。为了达到一个干净的,更Erlangish的解决方案,我们需要从更高的层面更多地了解这个问题。 IOW,看起来你有一个XY问题。 – zxq9

回答

0

在第二个子句中,您使用的是when is_atom(H) guard,它无法匹配子句(因为在这种情况下H是数字)。将其更改为when is_number(H)

+0

谢谢,我会在下面的答案中解决您的问题 – category

1

继维亚切斯拉夫·科瓦廖夫的回答的理由,因为我想在这里处理原子和数字,我已经提出了以下解决方案:

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]).