Ren*_*ino 3 functional-programming elixir
我正在学习函数式编程,我想实现这样的东西.
while(true) do
if(somethingHappensHere) {
break
}
counter++
end
return counter
Run Code Online (Sandbox Code Playgroud)
如何使用elixir以功能方式完成此操作?
谢谢你.
虽然在大多数函数式编程语言中,人们会使用递归来完成此任务,但Elixir特别提供了在不使用显式递归调用的情况下执行此操作的方法Enum.reduce_while/3:
Enum.reduce_while(1..100, 0, fn i, acc ->
if condition, do: {:halt, acc}, else: {:cont, acc + i}
end)
Run Code Online (Sandbox Code Playgroud)
对于懒惰的评估,人们会使用Stream.reduce_while/3.
为了使它无限,可以使用Stream模块提供的无限生成器之一,如Stream.iterate/2:
Stream.iterate(0, &(&1+1)) |> Enum.reduce_while(0, fn i, acc ->
if i > 6, do: {:halt, acc}, else: {:cont, acc + 1}
end)
#? 7
Run Code Online (Sandbox Code Playgroud)
为了递归,这是在Elixir中实现递归解决方案的方式:
defmodule M do
def checker, do: & &1 <= 0
def factorial(v, acc \\ 1) do
if checker().(v), do: acc, else: factorial(v - 1, v * acc)
end
end
M.factorial 6
#? 720
Run Code Online (Sandbox Code Playgroud)
不确定 Elixir 具体是什么,但你可以使用递归来实现这一点:
function myFunction(int counter)
{
if (condition) {
return counter
}
return myFunction(counter + 1)
}
Run Code Online (Sandbox Code Playgroud)
这本质上设置了一个可以无限递归(调用自身)的函数,每次传递下一个计数器值。
通过将递归调用作为函数执行的最后一件事,这被称为Elixir 支持的尾部调用递归(根据:Elixir 无限递归是否会溢出堆栈?)
然后可以这样使用:
int counterValue = myFunction(0)
Run Code Online (Sandbox Code Playgroud)
该函数仅在条件为真时返回。
您还可以通过让该函数采用另一个返回 true 或 false 的函数(即执行条件检查)来使其更加通用。
正如我所说,不幸的是我不知道 Elixir 的语法,但我相信你能够弥补这个差距。