Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 如何在Enum.map内调用匿名函数_Functional Programming_Elixir - Fatal编程技术网

Functional programming 如何在Enum.map内调用匿名函数

Functional programming 如何在Enum.map内调用匿名函数,functional-programming,elixir,Functional Programming,Elixir,我正在学习长生不老药,我正在Euler项目中努力加强我的长生不老药技能。现在我有这个密码 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)) 如何修复此问题?Elixir目前不允许定义匿名递归函数

我正在学习长生不老药,我正在Euler项目中努力加强我的长生不老药技能。现在我有这个密码

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))

如何修复此问题?

Elixir目前不允许定义匿名递归函数。您有两个选项:在任何模块内使用
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))
fib=fn
fib,a,b,0->a
fib,a,b,n->fib.(fib,b,a+b,n-1)
结束
IO.puts枚举和(枚举筛选器(枚举映射(1..50,fn n->fib.(fib,0,1,n)结束),fn(x)->rem(x,2)==0&&x<4000000结束))
我建议在模块中定义此函数,而不是使用此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))
def模块Fib-do
定义fib(a,_b,0),do:a
def fib(a,b,n),do:fib(b,a+b,n-1)
结束
IO.puts枚举和(枚举筛选器(枚举映射(1..50,fn n->Fib.Fib(0,1,n)结束),fn(x)->rem(x,2)==0&&x<4000000结束))
注意:
Enum.filter/2
的第二个参数中也有语法错误,我已经修复了(希望正确)


提示:请阅读有关管道操作符的信息,以使
IO更具习惯性:

非常感谢!对不起,我对长生不老药非常陌生,所以我还在试着去感受它的语言。没必要感到抱歉。我相信您的代码可以在多种语言中工作(它在JS中工作),并且有理由期待它在Elixir中工作。事实上,自OTP17以来,您可以在Erlang中定义匿名递归函数,但Elixir尚未实现等效功能。
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))