【问题标题】:Erlang exception error using BIF and lists:maps使用 BIF 和列表的 Erlang 异常错误:映射
【发布时间】:2014-09-17 23:34:25
【问题描述】:

我们的任务是编写一个函数 normalize/1,它将列表中的每个元素除以我的最大元素。

这是我到目前为止的代码(而不是我自己编写的函数,我使用内置函数来查找最大值):

normalize(List) -> 
    Z = lists:max(List),
    [ X / Z  || X  <- List].

现在我必须编写一个名为 normalize2 的函数,它的作用与 normalize/1 相同,但使用 lists: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 行)

更新:

这里是 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]) -> T; 第 84 行是 Z = find_max(List),

【问题讨论】:

  • 如果我在 normalize/1 中使用了自己的 find_max/1 函数,它会显示相同的错误,但不是“没有函数子句匹配列表:max(1)”而是没有函数子句匹配列表:最大(1,0)。

标签: list exception map erlang normalize


【解决方案1】:

lists:max 从列表中返回最大值。这意味着这个函数的参数必须是列表。

当您调用 lists:map 时,这意味着 -- 将某些功能(在您的情况下为“normailze”)应用于每个列表项。但列表项是整数。这就是Z=lists:max(List) 行抛出异常的原因(变量 List 实际上不是列表)。

您可以使用 lists:map 作为列表理解的替代品。种

normalize2(List) -> Z = lists:max(List), lists:map( fun(X) -> X/Z end, List).

【讨论】:

  • 如果我的输入是 [1,2,3,4] 并且我使用了 find_max/1,它会给我一个类似 [4] 的答案。如果我在上面写的 normalize2 上使用它,我会在终端中得到它:test3:normalize2([1,2,3,4])。 ** 异常错误:没有函数子句匹配 test3:'-normalize/1-lc$^0/1-0-'(1) (test3.erl, line 86) in function lists:map/2 (lists.erl,第 1224 行)
  • 1) 什么是 find_max? 2)你是如何使用它的? 3)如果你提供整个test3.erl会更好
  • 非常感谢您的回答。我希望我能投票赞成你的答案,但我还没有足够的声望点。再次感谢。
【解决方案2】:

由于您已经知道如何在normalize/1 中使用列表推导式,因此使用lists:map/2 编写“不同”的解决方案可能没有意义。

一定要培养一种心理反应,始终、立即将任何lists:map/2 的使用替换为漂亮的列表理解!

【讨论】:

  • 这是为什么呢?是因为它更容易阅读还是我遗漏了一些信息?
  • 确实没有其他原因。 lists:map/2 等价于推导式,可以避免编写匿名函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
相关资源
最近更新 更多