我们的任务是编写一个函数normalize / 1,它将列表中的每个元素划分为我的最大元素。
到目前为止我的代码(而不是我自己编写的函数,我使用内置的代码来查找最大值):
normalize(List) ->
Z = lists:max(List),
[ X / Z || X <- List].
现在我必须编写一个名为normalize2的函数,它与normalize / 1相同但使用列表:map / 2
normalize2(List) -> lists:map(fun normalize/1, List).
终端显示:
TEST3:normalize2([1,2,3,5])。 **异常错误:没有函数子句匹配列表:max(1)(lists.erl,第313行) 在函数test3中:normalize / 1(test3.erl,第85行) 来自列表的呼叫:map / 2(lists.erl,第1224行)
更新:
Heres find_max / 1:
find_max([T]) ->
T;
find_max([H,H1|T]) when H > H1->
find_max([H,T]);
find_max([_H,H1|T])->
find_max([H1|T]).
如果我使用^ find_max,终端会显示我:
TEST3:normalize2([1,2,3,5])。 **异常错误:没有匹配test3的函数子句:find_max(1)(test3.erl,第137行) 在函数test3中:normalize / 1(test3.erl,第84行) 来自列表的呼叫:map / 2(lists.erl,第1224行)
第137行是find_max([T]) - &gt;吨; 第84行是Z = find_max(List),
答案 0 :(得分:3)
列出:列表中的最大返回最大值。这意味着该函数的参数必须是list。
当您呼叫列表时:映射表示 - 将一些功能(在您的情况下为“normailze”)应用于每个列表项。但List项是整数。这就是为什么行Z=lists:max(List)
抛出异常(变量List实际上不是列表)。
你可以使用list:map作为列表理解的替代。
normalize2(List) -> Z = lists:max(List), lists:map( fun(X) -> X/Z end, List).
答案 1 :(得分:1)
由于你已经找到了如何在normalize/1
中使用列表推导,因此可能没有必要写一个&#34;不同的&#34;解决方案使用lists:map/2
。
确保发展一种心理反射,以便随时立即用lists:map/2
取代任何使用美丽列表理解的内容!