2

我想用 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 中做同样的事情呢?谢谢你的灯!

4

1 回答 1

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的 s 通用,而不仅仅是列表......


这是使用时的样子:

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"}]]]
于 2013-08-29T23:27:01.103 回答