Erlang: no match of right hand side value
Solution 1
Here is how to debug this kind of error:
Go to
module:function/2 (file.erl, line 42)
Find the offending matching operation that is definitely there
Replace the left-hand side with a fresh variable. Here you may figure out that you are trying to pattern-match against an already bound variable...
Add a call to
erlang:display/1
with the new variableRun the program again to print the value of this variable and understand why it doesn't match the given pattern
Here are some examples:
-
{_, Input} = io:get_line("Do you want to chat?") % Line 42
Replace this with:
Fresh1 = io:get_line("Do you want to chat?"), erlang:display(Fresh1), {_, Input} = Fresh1
Run the program again:
1> module:run(). Do you want to chat? Yes "Yes\n" ** exception error: no match of right hand side value "Yes\n" in function module:function/2 (file.erl, line 44)
You can see that
io:get_line/1
returns a string and not a tuple, so the matching against{_, Input}
fails. -
In an Erlang shell:
2> Pid = echo:start(). ** exception error: no match of right hand side value <0.41.0>
Here the variable Pid is definitely already bound to another value...
3> Pid. <0.39.0>
You can make the shell forget such a binding with
f(Var)
orf()
:4> f(Pid). ok 5> Pid. * 1: variable 'Pid' is unbound 6> Pid = echo:start(). <0.49.0>
Solution 2
the error report is more friendly that the simple bad match, it gives also the value that fails to match. If this value is "small" enough, it is fully displayed and it is often enough to understand what is going wrong:
-module(err).
-export([test/0]).
test() ->
"ok\n" = io:get_line("an input ? ").
test2() ->
F = fun() ->
"ok\n" = io:get_line("an input ? ")
end,
F().
in the shell:
1> c(err).
{ok,err}
2> err:test().
an input ? ok
"ok\n"
3> err:test().
an input ? ko
** exception error: no match of right hand side value "ko\n"
in function err:test/0 (err.erl, line 6)
4> F = fun() -> a = 10 end.
#Fun<erl_eval.20.106461118>
5> F().
** exception error: no match of right hand side value 10
6> err:test2().
an input ? ok
"ok\n"
7> err:test2().
an input ? ko
** exception error: no match of right hand side value "ko\n"
in function err:'-test2/0-fun-0-'/0 (err.erl, line 10)
8>
aronisstav
I am a: holder of a PhD degree in Computer Science from Uppsala University, with a dissertation titled "Effective Techniques for Stateless Model Checking" developer/maintainer of tools that detect errors in Erlang code, such as Dialyzer and Concuerror regular participant in Google Code Jam and ICFP Contest Greek
Updated on June 04, 2022Comments
-
aronisstav almost 2 years
A common error message in Erlang programs is the following:
** exception error: no match of right hand side value 'foo' in function module:function/2 (file.erl, line 42)
How can I debug this?