我从erlang开始,并且从一些简单的练习开始。在这种情况下,我试图计算高斯的三角形行。我不明白为什么收到此警告:
Warning: this clause cannot match because a previous clause at line 6 always matches
Run Code Online (Sandbox Code Playgroud)
问题与guard子句有关,但对我来说xD似乎合法。以下是完整的代码:
create_row(Initial)->create_row(Initial,[1]).
create_row([First|Rest],Current) ->
io:format("rest size: ~w ~n",[Rest]),
create_row(Rest,lists:append(Current,[First+lists:nth(1, Rest)]));
create_row([_|Rest],Current) when length(Rest)==0 -> lists:append(Current,[1]).
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
该create_row/2功能有2种模式,按此顺序:
create_row([First|Rest],Current) ->
Run Code Online (Sandbox Code Playgroud)
和
create_row([_|Rest],Current) when length(Rest)==0 ->
Run Code Online (Sandbox Code Playgroud)
模式按顺序匹配。第一种模式将匹配第二种情况的所有情况,因此第二种模式将永远不会执行。
如果您颠倒了功能的顺序,它应该可以工作:
create_row([_|Rest],Current) when length(Rest)==0 ->
lists:append(Current,[1]);
create_row([First|Rest],Current) ->
io:format("rest size: ~w ~n",[Rest]),
create_row(Rest,lists:append(Current,[First+lists:nth(1, Rest)])).
Run Code Online (Sandbox Code Playgroud)
现在,第一个函数将只匹配长度为0的那些函数,第二个函数将匹配其余的函数。
请注意,最具体的功能应该放在最前面。