Enums 如何在elixir中对使用Enum.map迭代的列表进行变异?或者需要关于使用嵌套递归的意见

Enums 如何在elixir中对使用Enum.map迭代的列表进行变异?或者需要关于使用嵌套递归的意见,enums,elixir,Enums,Elixir,我有两张长生不老药的单子。一个列表(list1)的值在另一个列表(list2)中使用。因此,我需要迭代list2并更新list1以及list2中的值 list1=[ %{ 注册编号:10, 分配给:100,, 分配:50 }, %{ 注册编号:11, 分配给:100,, 分配:30 }, %{ 注册编号:12, 分配给:100,, 分配:20 } ] 清单2=[ %{ 学生:学生1, 数量:60, 注册号:[注册号10,注册号11] }, %{ 学生:学生2, 数量:40, 注册号:[注册号11

我有两张长生不老药的单子。一个列表(
list1
)的值在另一个列表(
list2
)中使用。因此,我需要迭代
list2
并更新
list1
以及
list2
中的值

list1=[
%{
注册编号:10,
分配给:100,,
分配:50
},
%{
注册编号:11,
分配给:100,,
分配:30
},
%{
注册编号:12,
分配给:100,,
分配:20
}
]
清单2=[
%{
学生:学生1,
数量:60,
注册号:[注册号10,注册号11]
},
%{
学生:学生2,
数量:40,
注册号:[注册号11,注册号12]
},
%{
学生:学生3,
数量:30,
注册号:无
}
]
我需要将
list1
中的值分配到
list2
quantity
字段,直到
quantity
完成。e、 g.
student1
quantity
60
,需要
reg\u no 10
reg\u no 11

使用
Enum.map
时,我无法将更新后的
list1
传递给
list2
的第二次迭代,并为
student2
分配值regu nos:
regu no\u 11
regu no\u 12

所以,我的问题是如何将更新后的
list1
发送到
list2
中的第二次迭代


我使用递归来获得
list2
中每个元素的正确数量。但是,我是否应该使用递归只发送
list2
中更新的
list1
?使用这种方法,将有2个嵌套递归。这是一个好方法吗?

如果我正确理解您的问题,您希望根据另一个列表
y
中的值列表更改给定列表
x
中的值

由于不变性,您所描述的在函数式语言中是不可能的,但是您可以使用一个操作,其中
x
是状态或所谓的“累加器”

下面是一个示例,其中我有一个包含银行账户的分类账和一个包含交易的列表。如果我想根据交易更新分类账,我需要减少交易并更新每笔交易的分类账,并将更新后的分类账传递给下一笔交易。这也是你看到的问题

正如您在示例中所看到的,与
map
不同,用户定义函数(
ledger
)中有第二个参数。这是您在遍历事务列表时建立的“状态”。每次处理事务时,您都会更改以返回状态的修改版本。然后使用此状态处理第二个事务,而第二个事务反过来也可以更改它

reduce调用的最终结果是累加器。在这种情况下,更新的分类账

  def example do
    # A ledger, where we assume the id's are unique!
    ledger = [%{:id => 1, :amount => 100}, %{:id => 2, :amount => 50}]
    transactions = [{:transaction, 1, 2, 10}]

    transactions
    |> Enum.reduce(ledger, fn transaction, ledger ->
      {:transaction, from, to, amount} = transaction

      # Update the ledger.
      Enum.map(ledger, fn entry ->
        cond do
          entry.id == from -> %{entry | amount: entry.amount - amount}
          entry.id == to -> %{entry | amount: entry.amount + amount}
        end
      end)
    end)
  end

你好请展示您的代码,并解释什么不起作用,以及您希望它如何工作。从你的问题来看,似乎你确实有一个有效的解决方案,但想知道它是否“好”。如果这是真的,那么这个问题可能更适合代码审查stackexchange。@PawełObrok听起来他有一个工作解决方案想要扩展。这是一个特性请求。而那可能不在桅杆内。因为很难说代码处于什么状态以及询问什么。你好,Christophe De Troyer,有没有什么方法可以让您也更改金额的值,并在每次“从”和“到”操作后更新它?我需要更新您正在更新分类账的金额,并将其返回到下一笔交易。让我们假设,金额是银行的当前余额,所以每次交易后都应该更新。使用双递归,我可以更新金额的值。