列表尾中的Elixir匿名函数应用程序返回算术错误

时间:2018-01-30 14:41:30

标签: functional-programming erlang elixir

我对elixir和函数式编程很新,我有一张表格地图:

key => [int, int]

例如:

14 => [1,0]

使用下面的代码片段,我设法将[1,0]中的值1增加1,但我无法对第二个值(即“0”)执行相同操作。

这是我列表头部的工作示例代码

iex(2)> a = Map.update!(a, 'b', fn([a|b]) -> [a+1] ++ b end) 

这是我的代码和我为列表的第二个元素得到的错误,请注意我的列表只包含2个元素,这不会改变

iex(3)> a = Map.update!(a, 'b', fn([a|b]) -> a ++ [b+1] end) 
** (ArithmeticError) bad argument in arithmetic expression
    :erlang.+([0], 1)
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
    (stdlib) erl_eval.erl:228: :erl_eval.expr/5
    (stdlib) erl_eval.erl:470: :erl_eval.expr/5
    (elixir) lib/map.ex:727: Map.update!/3

3 个答案:

答案 0 :(得分:1)

在匹配[a|b] = [1,0]的第二种情况下,a将是一个整数(1),b将是一个列表([0])。为了使用该函数增加b,您需要更新匹配的部分以及如何处理a和b:

a = Map.update!(a, 'b', fn([a,b]) -> [a] ++ [b+1] end) 

或者您也可以

a = Map.update!(a, 'b', fn([a,b]) -> [a, b+1] end) 

构建更新列表。

答案 1 :(得分:1)

如果您想更新地图的所有密钥,请使用Enum.map,如下所示:

the_map
|> Enum.map(fn {k, [v1, v2]} -> {k, [v1+1, v2+1]} end)
|> Enum.into(%{})

请注意,Enum.map将返回一个列表(本例中为关键字列表),因此您需要将数据放回地图中。

答案 2 :(得分:0)

这是因为列表的尾部是一个列表:

iex(2)> [h | t] = [1, 0]
[1, 0]
iex(3)> h
1
iex(4)> t
[0]

当您查看错误说明时,:erlang.+([0], 1)表明您要将[0]添加到1

如果要将列表与两个元素进行模式匹配,则可以执行以下操作:

fn([a, b]) -> [a + 1, b + 1] end

但是,在这种情况下,最好使用元组。