异常错误:右侧值[]不匹配

时间:2016-01-28 01:29:41

标签: erlang

我正在尝试查看列表中是否存在字母,我目前正在执行以下操作

sortedlist(Text)-> freq(lists:sort(Text)).

freq(List) -> freq (List, [], []).

freq(List, Freq, CheckedLetters) when length(List) > 0 -> 
    [CurrHead|T]= List,
    Checked = lists:member(CurrHead,CheckedLetters),
    case Checked of
            false -> CheckedLetters++[CurrHead],
                    freq(T,Freq++[{CurrHead,count(CurrHead, List)}],CheckedLetters);
            true -> freq(T,Freq,CheckedLetters)
    end;
freq([],Freq,CheckedLetters)-> Freq.
  • 列表包含用户输入的字母

  • CheckedLetters是一个空列表,用于跟踪已经检查过的字母

但我在case-statement行(带**的行)收到以下erlang异常。

  

错误:右侧值[]

不匹配

这是什么问题?我一直盲目地盯着那些台词。

2 个答案:

答案 0 :(得分:1)

递归函数中缺少结束条件。因此,当列表变空时(每当你回想起尾部的函数变小时),匹配[CurrHead|T]= List,会失败并显示错误。

您必须添加一个子句来管理递归的结束:

freq([], Freq, CheckedLetters) when length(List) > 0 -> 
    {Freq, CheckedLetters};
freq(List, Freq, CheckedLetters) when length(List) > 0 -> 
    [CurrHead|T]= List,
    Checked = lists:member(CurrHead,CheckedLetters),
    case Checked of
            true -> CheckedLetters++[CurrHead],
                    freq(T,Freq++[{CurrHead,count(CurrHead, List)}],CheckedLetters);
            false -> freq(T,Freq,CheckedLetters)
    end;

我认为你还要审查内部操作,我怀疑它是在做你期望的。特别是CheckedLetters++[CurrHead],行没有效果。

<强> [编辑] 别忘了在erlang中变量不可变。所以行CheckedLetters++[CurrHead]只是简单地计算一个新列表并忘记结果(实际上我不确定它做了什么,因为你没有将这个评估绑定到任何变量,并且编译器知道它。)

我想你想要做的是:

case Checked of
        true -> 
            freq(T,Freq++[{CurrHead,count(CurrHead, List)}],CheckedLetters++[CurrHead]);
        false ->
            freq(T,Freq,CheckedLetters)
end;

接下来你应该看看Freq++[{CurrHead,count(CurrHead, List)}],我认为这是不正确的。

答案 1 :(得分:0)

该块中唯一可以error: no match of right hand side value []的代码是[CurrHead|T]= List,正如Steve Vinoski所说。可能有一些情况,List是一个空列表而不是一个字母列表。

此外,您共享的代码块中的最后一行:

case Checked == false of
    ...
end

可以简化为:

case Checked of
    true ->
       ...
     false ->
       ...
end

由于Checkedlists:member/2的返回值,并且lists:member/2保证返回布尔值,因此您可以直接在true和{{1}上匹配原子。

false文档:http://erlang.org/doc/man/lists.html#member-2