【问题标题】:erlang - exception error: no function clause matchingerlang - 异常错误:没有函数子句匹配
【发布时间】:2015-01-14 00:55:29
【问题描述】:

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

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

【问题讨论】:

  • 你想完成什么?这里有两个正交的问题:列表形成和条件检查。为了得到一个干净的、更 Erlangish 的解决方案,我们需要从更高的层次更多地了解这个问题。 IOW,看来你有一个 XY 问题。

标签: function erlang pattern-matching


【解决方案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]).

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢,我会在下面的答案中调整您的解决方案以适应这种情况
    猜你喜欢
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2018-09-03
    • 2018-11-29
    • 2015-12-06
    • 1970-01-01
    相关资源
    最近更新 更多