gpt4 book ai didi

functional-programming - 如何在 Enum.map 中调用匿名函数

转载 作者:行者123 更新时间:2023-12-04 08:40:46 25 4
gpt4 key购买 nike

我正在学习 Elixir,我正在参与 Project Euler 以尝试加强我在 Elixir 中的技能。现在我有这个代码

fib = fn
a,b,0 -> a
a,b,n -> fib.(b, a+b, n-1)
end
IO.puts Enum.sum(Enum.filter(Enum.map(1..50, fn n -> fib.(0,1,n) end), even and fn(x) -> x < 4000000 end))

但是当我运行这段代码时,我得到:
undefined function fib/0
(elixir) src/elixir_fn.erl:33: anonymous fn/3 in :elixir_fn.expand/3
(stdlib) lists.erl:1238: :lists.map/2
(stdlib) lists.erl:1238: :lists.map/2
(elixir) src/elixir_fn.erl:36: :elixir_fn.expand/3

我该如何解决?

最佳答案

Elixir 目前不允许定义匿名递归函数。您有 2 个选项:使用 def 定义一个普通函数在任何模块中,或使用以下技巧(hack?)来制作匿名递归函数:

fib = fn
fib, a, b, 0 -> a
fib, a, b, n -> fib.(fib, b, a+b, n-1)
end

IO.puts Enum.sum(Enum.filter(Enum.map(1..50, fn n -> fib.(fib, 0, 1, n) end), fn(x) -> rem(x, 2) == 0 && x < 4000000 end))

我建议在模块中定义这个函数,而不是使用这个 hack:
defmodule Fib do
def fib(a, _b, 0), do: a
def fib(a, b, n), do: fib(b, a + b, n - 1)
end

IO.puts Enum.sum(Enum.filter(Enum.map(1..50, fn n -> Fib.fib(0, 1, n) end), fn(x) -> rem(x, 2) == 0 && x < 4000000 end))

注意: Enum.filter/2 的第二个参数也有语法错误。我已经修复了(希望是正确的)。

提示:请阅读有关管道运算符的信息以制作 IO.puts更惯用的代码: http://elixir-lang.org/getting-started/enumerables-and-streams.html#the-pipe-operator

关于functional-programming - 如何在 Enum.map 中调用匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37888797/

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