如何在Elixir中的匿名函数中分配局部变量?

时间:2016-03-17 13:06:54

标签: elixir

我想找到一个数字的素因子。我写道:

defmodule Prime do
  def factors(n) when is_integer(n) and n > 1 do
    Stream.unfold(n, fn 1 -> nil; n -> &({&1, div(n, &1)}).(lf n) end) |> Enum.to_list
  end

  def lf(n) when is_integer(n) and n > 1 do
    if rem(n, 2) == 0 do 2
    else Stream.iterate(3, &(&1 + 2)) |> Stream.filter(&(rem(n, &1) == 0))
                                      |> Stream.take(1) |> Enum.to_list |> hd
    end
  end
end

问题出在第3行:在匿名函数中我必须返回元组{f, n / f},其中fn的最低因子,并在{{1}中计算功能。但是,我不想计算两次(我可以做lf)。我也试图定义一个闭包,但显然它是不允许的。

我使用的技巧甚至不起作用。

怎么做?

1 个答案:

答案 0 :(得分:3)

您是否尝试在匿名函数中分配局部变量?我添加了换行符以使其更具可读性。

def factors(n) when is_integer(n) and n > 1 do
  Stream.unfold(n,
    fn 1 -> nil
       n -> local = lf n
            {local, div(n, local)}         
    end) |> Enum.to_list
end

顺便说一句,您可以使用Enum.find缩短lf功能。 (我还将lf作为私人功能。)

defp lf(n) when is_integer(n) and n > 1 do
  if rem(n, 2) == 0 do 2
  else Stream.iterate(3, &(&1 + 2)) |> Enum.find(&(rem(n, &1) == 0))
  end
end