gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:46:07 36 4
gpt4 key购买 nike

我想找出一个数的质因数。我写道:

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 并在 lf 函数中计算。但是,我不想计算它两次(我可以这样做{lf n, div(n, lf n)})。我也尝试定义一个闭包,但显然这是不允许的。

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

它是怎么做到的?

最佳答案

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

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 设为私有(private)函数。)

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

关于elixir - 如何在 Elixir 的匿名函数中分配给局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36061446/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com