使用BIF和列表的Erlang异常错误:maps

时间:2014-09-17 13:03:15

标签: list exception map erlang normalize

我们的任务是编写一个函数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),

2 个答案:

答案 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取代任何使用美丽列表理解的内容!