Functional programming 比较并减少两个列表中的对

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的三元组和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) 
    |> 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