2013-08-29 2 views
2

Я хотел бы нанести на карту каждый квадрат массива (из n массивов) с помощью Elixir.глубокая карта массива с Elixir

С 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 } 

Как мы могли бы сделать то же самое в эликсира? Спасибо за ваши огни!

ответ

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"}]]] 
+1

Удивительный, спасибо @legoscia! Работайте отлично! – Doug

Смежные вопросы