Преобразование вложенных списков может быть сделано разными способами; здесь наиболее подходящим было бы использование сопоставления с образцом в выражениях mapper.
input = [
["Language", "Elixir"],
["Language", "Python"],
["Language", "Rust"],
["Framework", "Phoenix", "1"]
]
Enum.map(input, fn
[kind, name] ->
[kind, String.to_atom(name)]
[kind, name, ver] ->
[kind, String.to_atom(name), String.to_integer(ver)]
end)
#⇒ [
# ["Language", Elixir],
# ["Language", :Python],
# ["Language", :Rust],
# ["Framework", :Phoenix, 1]
# ]
Использование карты было бы более удобным, поскольку вы могли бы разумно обрабатывать обновление независимо от того, представлен ключ или нет.