Дословный перевод фрагмента, который вы опубликовали в JS, на Elixir будет выглядеть примерно так:
memoization = fn fun ->
fn n, acc ->
acc =
if(!acc[n]) do
Process.sleep(1_000)
IO.inspect acc, label: "Just put... Need a rest... Sleeping... Zzzz..."
Map.put(acc, n, fun.(n))
else
acc
end
{acc, Map.get(acc, n)}
end
end
fun = memoization.(& &1 * 2)
{acc, _} = IO.inspect fun.(42, %{}), label: "Result for 42"
{acc, _} = IO.inspect fun.(42, acc), label: "Result for 42"
{acc, _} = IO.inspect fun.(3.14, acc), label: "Result for 3.14"
{_, _} = IO.inspect fun.(3.14, acc), label: "Result for 3.14"
В результате:
# Just put... Need a rest... Sleeping... Zzzz...: %{}
# Result for 42: {%{42 => 84}, 84}
# Result for 42: {%{42 => 84}, 84}
# Just put... Need a rest... Sleeping... Zzzz...: %{42 => 84}
# Result for 3.14: {%{42 => 84, 3.14 => 6.28}, 6.28}
# Result for 3.14: {%{42 => 84, 3.14 => 6.28}, 6.28}
Необходимо пропустить аккумулятор, так как в Elixir нет глобального состояния. Ой, подождите, на самом деле есть!
Я написал подробный пост в блоге о том, как запоминать функции в Elixir с примером и готовым к использованию кодом.