Function Erlang:标识列表中的max元素

Function Erlang:标识列表中的max元素,function,erlang,max,Function,Erlang,Max,我对Erlang有点陌生,但现在开始。我想创建一个辅助函数,它接受列表中最高的正整数并返回这个值。在代码中,我的方法如下: -module(function). -export([normalize/1]). normalize(List) -> normalize(List, 0). normalize([], N) -> N; ​normalize([H|T], N) when H >

我对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).

我在最后一行不断得到一个语法错误(怀疑警卫出了什么问题),在第一行还有“function normalize/2未定义”。我该怎么做

我不知道你为什么在最后一行比较H和N(
H==N
),但是要修正你的方法,你只需要用
H
替换
H==N
。这将使它适用于像
[1,2,3]
这样的列表,但对于像
[3,1,2]
[1,1,1]
这样的列表,它将失败,因为保护检查将失败

要修复最后一种情况,您需要添加另一个带有保护检查的function子句,如
H=
。基于您的代码,这里是一个完整的版本

-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).
-模块(功能)。
-导出([normalize/1])。
规范化(列表)->规范化(列表,0)。
归一化([],N)->N;
当H>N->normalize(T,H)时,归一化([H | T],N);
当H=normalize(T,N)时,normalize([H | T],N)。
但是,有一个函数可以查找列表的max元素
list:max/1
,我强烈建议您查看它的;这真的很简单


另外,您的示例不包含列表理解,因此我更新了问题标题和标记。还有最后一件事,
normalize
这个名称对于函数的用途来说不太合适:)。

我不知道为什么在最后一行比较H和N(
H==N
),但是要解决这个问题,只需要用
H
替换
H==N
。这将使它适用于像
[1,2,3]
这样的列表,但对于像
[3,1,2]
[1,1,1]
这样的列表,它将失败,因为保护检查将失败

要修复最后一种情况,您需要添加另一个带有保护检查的function子句,如
H=
。基于您的代码,这里是一个完整的版本

-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).
-模块(功能)。
-导出([normalize/1])。
规范化(列表)->规范化(列表,0)。
归一化([],N)->N;
当H>N->normalize(T,H)时,归一化([H | T],N);
当H=normalize(T,N)时,normalize([H | T],N)。
但是,有一个函数可以查找列表的max元素
list:max/1
,我强烈建议您查看它的;这真的很简单


另外,您的示例不包含列表理解,因此我更新了问题标题和标记。最后一件事,名称
normalize
对于函数目的来说并不合适:)。

H==N
返回true或false,因此如果您的代码最终调用
normalize(T,true)
,true将被“指定”为N(实际上模式与N匹配,并且因为N是未绑定的,N将被绑定为true)--不是您想要的。
H==N
返回true或false,因此如果您的代码最终调用
normalize(T,true)
,则true将被“指定”为N(实际上模式与N匹配,并且由于N未绑定,N将被绑定为true)——这不是您想要的;这真的很简单。我可以想到一个更简单的实现:
max([max | T])->max(max,T)
。等等,看看它的执行情况;这真的很简单。我可以想到一个更简单的实现:
max([max | T])->max(max,T)
。等