与Elixir的数组深度图

时间:2013-08-29 21:57:38

标签: arrays elixir

我想用Elixir映射一个数组(n个数组)的每个方块。

使用Ruby,可以使用这一堆代码来完成:

class Object
  def deep_map(&block)
    block.call(self)
  end
end

class Array
  def deep_map(&block)
    map {|e| e.deep_map(&block) }
  end
end

然后,

[
  [
    [nil, "foo"],
    [nil, nil]
  ],
  [
    [nil, "bar"],
    [nil, "baz"]
  ]
].deep_map {|el| el.to_s * 2 }

我们怎么能在Elixir做同样的事情?谢谢你的灯!

1 个答案:

答案 0 :(得分:2)

我玩了一下,想出了这个:

defmodule DeepMap do

def deep_map(list, fun) when is_list(list) do
    Enum.map(list, fn(x) -> deep_map(x, fun) end)
end

def deep_map(not_list, fun) do
    fun.(not_list)
end

end

可能有一种方法可以使它对所有嵌套的Enumerable都通用,而不仅仅是列表......


这是使用时的样子:

iex(3)> c "/tmp/deep_map.ex"
[DeepMap]
iex(4)> deep_list = [
...(4)>   [
...(4)>     [nil, "foo"],
...(4)>     [nil, nil]
...(4)>   ],
...(4)>   [
...(4)>     [nil, "bar"],
...(4)>     [nil, "baz"]
...(4)>   ]
...(4)> ]
[[[nil, "foo"], [nil, nil]], [[nil, "bar"], [nil, "baz"]]]
iex(6)> DeepMap.deep_map deep_list, fn(x) -> {x,x} end     
[[[{nil, nil}, {"foo", "foo"}], [nil: nil, nil: nil]],
 [[{nil, nil}, {"bar", "bar"}], [{nil, nil}, {"baz", "baz"}]]]