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,有没有什么方法可以让您也更改金额的值,并在每次“从”和“到”操作后更新它?我需要更新您正在更新分类账的金额,并将其返回到下一笔交易。让我们假设,金额是银行的当前余额,所以每次交易后都应该更新。使用双递归,我可以更新金额的值。