Erlang:标识列表中的max元素

Jaz*_*ron 1 erlang function max

我是Erlang的新手,但是这里。我想创建一个辅助函数,该函数采用列表中的最高正整数并返回此值。我在代码中的处理方法如下:

-module(function).
-export([normalize/1]).

    normalize(List) -> normalize(List, 0).

    normalize([], N) -> N;                                
    ?normalize([H|T], N) when H > N -> normalize(T, H==N).
Run Code Online (Sandbox Code Playgroud)

我在最后一行不断收到语法错误(怀疑后卫有问题),并且在第一行上也未定义“ function normalize / 2”。我该如何工作?

Ahm*_*rif 5

我不确定为什么H==N在最后一行将H与N()进行比较,但是要解决此问题,您所需要做的就是H==N用just 代替H。这将使其成为像列表一样工作[1,2,3],但它会失败像列表[3,1,2]或者[1,1,1],因为保护检查将失败。

要解决最后一种情况,您需要添加另一个带有卫队检查的功能子句,例如H =< N。以您的代码为基础,这是一个完整的版本

-module(function).
-export([normalize/1]).

normalize(List) -> normalize(List, 0).

normalize([], N) -> N;
normalize([H|T], N) when H > N -> normalize(T, H);
normalize([H|T], N) when H =< N -> normalize(T, N).
Run Code Online (Sandbox Code Playgroud)

但是,有一个函数可以找到列表的max元素,lists:max/1强烈建议您看一下它的实现;这真的很简单。

另外,您的示例不包括列表理解,因此我更新了问题标题和标签。最后一件事,该名称normalize对于功能目的而言不是很好:)。