Functional programming 长生不老药如何在不经过两次地图的情况下同时绘制和减少

Functional programming 长生不老药如何在不经过两次地图的情况下同时绘制和减少,functional-programming,elixir,Functional Programming,Elixir,我有一份包含 %{price, order_details} 我想得到订单中的总价格,我还想返回和使用该映射中每个元素的订单详细信息构建的变更集数组。 如果不使用一个reduce和一个map,我找不到一种方法来完成它,但这是列表中的两个行程。这是函数式编程的一个良好实践?我假设数据如下所示: list = [ %{price: 1, order_details: "foo"}, %{price: 2, order_details: "bar"}, %{price: 3, order

我有一份包含

%{price, order_details}
我想得到订单中的总价格,我还想返回和使用该映射中每个元素的订单详细信息构建的变更集数组。
如果不使用一个reduce和一个map,我找不到一种方法来完成它,但这是列表中的两个行程。这是函数式编程的一个良好实践?

我假设数据如下所示:

list = [
  %{price: 1, order_details: "foo"},
  %{price: 2, order_details: "bar"},
  %{price: 3, order_details: "baz"},
]
您仍然可以使用带有sum和list元组的
reduce
作为累加器

list
|> Enum.reduce({0, []}, fn x, {sum, list} ->
  {sum + x.price, [x.order_details | list]}
end)
|> IO.inspect
输出:

{6, ["baz", "bar", "foo"]}

@Dogbert的答案也是完全正确的,在Elixir()中有一个内置的map reduce:

列表=[
%{价格:1,订单详情:“foo”},
%{价格:2,订单详情:“酒吧”},
%{价格:3,订单详情:“baz”},
]
Enum.map\u reduce(列表,0,fn(%{订单详细信息:od,价格:p},acc)->
{od,acc+p}#'od'是映射器,'acc+p'是还原器
(完)
#⇒{[“foo”,“bar”,“baz”],6}
您试过了吗