【问题标题】:exception error: no match of right hand side value []异常错误:右侧值不匹配 []
【发布时间】:2016-05-05 05:30:57
【问题描述】:

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

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 异常。

错误:右侧值不匹配 []

这里有什么问题?我一直在盲目地盯着那些线条。

【问题讨论】:

  • 我怀疑要么你在误导自己,真正的错误是 List[] ,所以永远不能匹配 [CurrHead|T] ,它只能匹配一个或多个列表元素,或者你没有展示足够多的代码来让任何人找到真正的问题。
  • 现在包含完整的代码 :) !

标签: erlang


【解决方案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)}],我觉得不正确。

【讨论】:

  • 非常正确,代码现在可以运行,但我看不到 CheckedLetters++[CurrHead] 的效果。知道为什么它不起作用吗?我正在做的是尝试将已经检查过的字母添加到 CheckedLetters 列表中。
  • Freq++[{CurrHead,count(CurrHead, List)}] 正在按我的意愿工作,完全没有问题。感谢您给我的新代码行,解决了以前的问题。现在一切正常,谢谢:D
【解决方案2】:

正如史蒂夫维诺斯基所说,该块中唯一可以error: no match of right hand side value [] 的代码是[CurrHead|T]= List。可能在某些情况下List 是一个空列表而不是字母列表。

另外,你分享的代码块的最后一行:

case Checked == false of
    ...
end

可以简化为:

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

由于Checkedlists:member/2 的返回值,并且lists:member/2 保证返回一个布尔值,您可以安全地直接匹配truefalse 原子。

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

【讨论】:

  • 感谢您简化案例陈述的提示, List 不应为空,我将 userinput 放在 LIst 中。我用函数的完整代码更新了帖子,以便清楚地看到它。
猜你喜欢
  • 2015-12-06
  • 2019-02-27
  • 1970-01-01
  • 2014-02-06
  • 2020-10-08
  • 2014-04-12
  • 2023-03-13
  • 2012-07-01
  • 1970-01-01
相关资源
最近更新 更多