erlang 中空列表和未绑定变量之间的区别


max([H|T]) -> max2(T, H).        %% find the maximum of a list
max2([], Max) -> Max;
max2([H|T], Max) when H > Max -> max2(T, H);
max2([_|T], Max) -> max2(T, Max).

如果你看一下函数的第二行和最后一行,它有点令人困惑。第二行说:"如果头部为空列表,则返回尾部"。

最后一行说:"???"。

如果头是解绑的,那又如何?

从本质上讲,我想弄清楚的是 - 空列表和未绑定变量之间存在差异,还是它们相同?

列表[]模式仅在空列表上匹配。未绑定的_将匹配任何内容。因此,上面的第二行说,"我们已经完成了列表的递归,所以输出Max"。

底部的 2 行是:

max2([H|T], Max) when H > Max -> max2(T, H);

上面的一行说,"如果扬程大于当前最大值,则使扬程最大并继续前进">

max2([_|T], Max) -> max2(T, Max).

然后这一行说,"否则,扬程小于当前最大值,所以继续使用当前最大值(我们使用_忽略磁头(">

在 erlang 中,重载函数按从上到下的顺序调用。 因此,如果朝向顶部的函数存在模式匹配,则不会调用朝向底部的函数。 它有点像递归if...else if...else结构。

第二行实际上说"如果tail是空列表,...",而不是head,因为您将tail作为第一个参数传递给max2

最后一行说当列表中的下一个元素不大于当前max时,只需忽略它并使用剩余列表和当前max调用max2

最新更新