【问题标题】:exception error: no match of right hand side value 2 [duplicate]异常错误:右侧值2不匹配[重复]
【发布时间】:2016-04-03 19:24:04
【问题描述】:

我的代码正在寻找最大回文数,别名 N = reverse(N)。代码还没有完成。但是请帮助我找出异常的原因。

find_palindrome(List1, List2, Increment, IfPalindrome) ->
  List_of_values = [X * Y || X <- List1, Y <- List2],
  find_palindrome(0, 1, List_of_values, Increment, IfPalindrome).

find_palindrome(Max, N, List_of_values, Increment, IfPalindrome) ->
  case IfPalindrome(lists:nth(N, List_of_values)) of
    true ->
      case Max < lists:nth(N, List_of_values) of
        true ->
          Max = lists:nth(N, List_of_values),
          find_palindrome(Max, Increment(N), List_of_values, Increment, IfPalindrome);
        false ->
          find_palindrome(Max, Increment(N), List_of_values, Increment, IfPalindrome)
      end;
    false ->
      find_palindrome(Max, Increment(N), List_of_values, Increment, IfPalindrome)
  end.


check_palindrome(N) ->
  (N) == (list_to_integer(lists:reverse(integer_to_list(N)))).

problem4() ->
  find_palindrome(lists:seq(100, 999), lists:seq(100, 999), fun(X) -> X = X + 1 end, fun check_palindrome/1).

我经常遇到异常:

** exception error: no match of right hand side value 2
     in function  euler4:'-problem4/0-fun-0-'/1 (euler4.erl, line 36)
     in call from euler4:find_palindrome/5 (euler4.erl, line 28)

【问题讨论】:

  • 这也是 stackoverflow.com/q/6438041/409228 的副本。在问你的问题之前,你有没有费心搜索 SO?这个问题已经在这里回答过无数次了。
  • 在您知道它与其他关于变量不变性的问题重复之前,您首先需要知道这是关于变量不变性的,更重要的是,要知道存在这样的事情。这是第一个链接的副本,但我看不出它是如何与第二个链接重复的。而且您需要知道问题的答案,然后才能看到它是重复的。做个好人。
  • 这个问题是关于一段特定的代码不起作用。解决方案与另一个问题相似的事实并不会使其重复。许多问题可以通过相同或相似的答案来回答,但重要的是特定答案回答特定问题的原因,而不是答案本身。

标签: erlang


【解决方案1】:

在 Erlang shell 中试试这个:

1> X = 1.
1
2> X = X + 1.
** exception error: no match of right hand side value 2

这是因为在 Erlang 中变量只能被赋值一次。它被称为single assignment。一旦变量绑定到一个值,该变量就不能绑定到任何其他值。存储在变量中的值不能更改。您需要创建一个新变量。在这种特殊情况下,您可以编写:

3> Y = X + 1.
2

【讨论】:

    【解决方案2】:

    你应该知道=实际上是一个模式匹配运算符,而不是赋值。左侧可以是任何模式,而不仅仅是变量。你可以写例如2 = 1 + 1 这将成功匹配,而3 = 1 + 1 将给您no match of right hand side value 2。绑定变量可以在模式中用于它们的值,例如X = 2, X = 1 + 1 会成功。

    所以在Max = lists:nth(N, List_of_values) 中,因为Max 已经被绑定(作为函数的参数),所以它的值被使用,它最终是0 = lists:nth(1, List_of_values)(使用来自find_palindrome(0, 1, List_of_values, Increment, IfPalindrome) 的值,除非@ 987654330@ 以0 开头。

    【讨论】:

      猜你喜欢
      • 2016-05-05
      • 2015-12-06
      • 2019-02-27
      • 2014-02-06
      • 2020-10-08
      • 2014-04-12
      • 2023-03-13
      • 2012-07-01
      • 2018-03-19
      相关资源
      最近更新 更多