【发布时间】:2014-12-24 05:34:46
【问题描述】:
我看到在 Dict 模块中有一个 update,但是更改所有值的 update_all 方法呢?
我尝试使用 Enum.map 执行此操作,但类型发生了变化:
iex(6)> Enum.map(%{:a => 2}, fn {k, v} -> {k, v + 1} end)
[a: 3]
【问题讨论】:
标签: functional-programming elixir
我看到在 Dict 模块中有一个 update,但是更改所有值的 update_all 方法呢?
我尝试使用 Enum.map 执行此操作,但类型发生了变化:
iex(6)> Enum.map(%{:a => 2}, fn {k, v} -> {k, v + 1} end)
[a: 3]
【问题讨论】:
标签: functional-programming elixir
这里有一个想法:
def update_map map, [head|tail], func do
update_map(
Dict.update(map, head, :unknown, func),
tail,
func
)
end
def update_map map, [], _ do
map
end
然后调用它:
iex(1)> d = %{:a => 1, :b => 2, :c => 3}
%{a: 1, b: 2, c: 3}
iex(2)> update_map(d, Dict.keys(d), fn v -> v + 1 end)
%{a: 2, b: 3, c: 4}
【讨论】:
您可以通过管道传递给Enum.into(%{}) 或使用for 理解,即:
iex> for {k, v} <- %{a: 1, b: 2}, into: %{}, do: {k, v + 1}
%{a: 2, b: 3}
【讨论】:
你也可以这样做:
iex> Map.new(%{:a => 2}, fn {k, v} -> {k, v + 1} end)
%{:a => 3}
但感觉标准库中应该有一些东西可以让这更容易(Map.??(%{:a => 2}, &(&1 + 1)))。
【讨论】:
让我添加Enum.into 到组合中
headers
|> Enum.group_by(fn {k, _v} -> k end, fn {_k, v} -> v end)
|> Enum.into(%{}, fn {k, v} -> {k, Enum.join(v, ", ")} end)
这样转:
[{"cookie", "a"}, {"cookie", "b"}] into %{"cookie", "a, b"}
【讨论】: