gpt4 book ai didi

functional-programming - 在列表理解中重新分配变量

转载 作者:行者123 更新时间:2023-12-04 23:19:08 27 4
gpt4 key购买 nike

我是来自 OO 背景的 Elixir 和函数式编程的新手。

我一直试图了解 Elixir 在列表理解中的变量重新分配是如何工作的。我希望函数 test1() 和 test2() 打印 4,但 test2() 不会重新分配变量并打印 1。

defmodule SampleCode do
def test1 do
num = 1
num = num + 1
num = num + 2
IO.puts num # Prints 4
end

def test2 do
num = 1
for i <- (1..2) do
num = num + i
end
IO.puts num # Prints 1
end
end
  • 为什么它们这些功能的行为不同?
  • 这是 Elixir 中的变量作用域,还是我缺少的函数式编程的基本原则?
  • 最佳答案

    Is this a variable scoping thing in Elixir or a basic principle in functional programming that I'm missing?



    实际上两者都是。

    Elixir 只允许在相同范围和所有构造中重新绑定(bind), case 除外。 , condreceive ,引入一个新的范围。一些例子:
    num = 1

    try do
    num = 2
    after
    num = 3
    end

    num #=> 1

    乐趣:
    num = 1
    (fn -> num = 2 end).()
    num #=> 1

    现在该规则的一些异常(exception)示例:
    num = 1
    case true do
    true -> num = 2
    end
    num #=> 2

    num = 1
    cond do
    true -> num = 2
    end
    num #=> 2

    尽管如此,上面的情况还是有点不鼓励,因为最好显式地返回值:
    num = 1
    case x do
    true -> 2
    false -> num
    end
    #=> will return 1 or 2

    上面的示例明确了从 case 返回的值是什么。为什么即使不推荐在 Elixir 中支持这些,也是一个很长的故事,它起源于 Erlang,并且由于 Elixir 中的一些(极少数)命令式宏,如 if 而继续存在。和 unless .随着我们向 Elixir 2.0 迈进,它可能会发生变化。

    执行您想要的操作的最佳方式是通过 Enum 中的函数。 .您的特定示例可以使用 Enum.sum/1 来完成但是任何其他复杂的例子都可以用 Enum.reduce/3 来实现(Enum 中几乎所有的函数都是通过 reduce 来实现的,在其他语言中可能会折叠)。

    关于functional-programming - 在列表理解中重新分配变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32422971/

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