使用空列表作为保护子句

rdi*_*z82 0 erlang

我从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)

有任何想法吗?

Asi*_*aga 5

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的那些函数,第二个函数将匹配其余的函数。

请注意,最具体的功能应该放在最前面。