Function Erlang:标识列表中的max元素
我对Erlang有点陌生,但现在开始。我想创建一个辅助函数,它接受列表中最高的正整数并返回这个值。在代码中,我的方法如下: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 >
-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)
。等