Functional programming 比较并减少两个列表中的对
给定Alice的三元组和Bob的三元组(列表),我需要比较每个元素,因此如果Functional programming 比较并减少两个列表中的对,functional-programming,elixir,Functional Programming,Elixir,给定Alice的三元组和Bob的三元组(列表),我需要比较每个元素,因此如果Alice\u triplet[I]Bob\u triplet[I],Alice的分数将增加1,反之亦然 我有以下代码: def main do alice_triplet = [5, 6, 7] bob_triplet = [3, 6, 10] alice_score = 0 bob_score = 0 Enum.zip(alice_triplet, bob_triplet)
Alice\u triplet[I]
Bob\u triplet[I]
,Alice的分数将增加1,反之亦然
我有以下代码:
def main do
alice_triplet = [5, 6, 7]
bob_triplet = [3, 6, 10]
alice_score = 0
bob_score = 0
Enum.zip(alice_triplet, bob_triplet)
|> Enum.each(fn
tuple when elem(tuple, 0) > elem(tuple, 1) -> alice_score = alice_score + 1
tuple when elem(tuple, 1) > elem(tuple, 0) -> bob_score = bob_score + 1
_ -> nil end)
IO.puts alice_score
IO.puts bob_score
end
但是,结果是:
0
0
为什么??我认为这与变量范围有关,因为我得到了以下警告:
警告:变量“alice_score”是未使用的解决方案。例如:12
警告:变量“bob_score”是未使用的解决方案。例如:13
有没有一种“更实用”的方法来做到这一点?我正在学习长生不老药(实际上是FP),所以任何建议都将受到欢迎。语句
alice\u score=alice\u score+1
不会修改外部alice\u score
,它会创建一个新的本地alice\u score
,其值设置为外部值+1。这一点已在本文中讨论过。解决方案几乎总是使用Enum.reduce/3
,将需要更改的状态用作累加器
以下是如何将其应用于代码:
alice_triplet = [5, 6, 7]
bob_triplet = [3, 6, 10]
{alice_score, bob_score} = Enum.zip(alice_triplet, bob_triplet) |>
Enum.reduce({0, 0}, fn
tuple, {as, bs} when elem(tuple, 0) > elem(tuple, 1) -> {as + 1, bs}
tuple, {as, bs} when elem(tuple, 1) > elem(tuple, 0) -> {as, bs + 1}
_, {as, bs} -> {as, bs}
end)
IO.puts alice_score
IO.puts bob_score
您还可以使用模式匹配而不是elem/2
(在惯用的长生不老药代码中很少使用elem/2
)来简化代码:
两种情况下的输出都是
1
1
哇,太棒了!非常感谢你!
1
1