我正在尝试查看列表中是否存在字母,我目前正在执行以下操作
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异常。
错误:右侧值[]
不匹配
这是什么问题?我一直盲目地盯着那些台词。
答案 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
由于Checked
是lists:member/2
的返回值,并且lists:member/2
保证返回布尔值,因此您可以直接在true
和{{1}上匹配原子。