【问题标题】:Erlang/ variable assignmentErlang/变量赋值
【发布时间】:2014-07-18 19:31:36
【问题描述】:

我研究了 Erlang,对变量的重新分配感到困惑,例如计数器是可能的:

循环(值,计数器)-> io:format("~s,~n",[值]), 循环(值,Counter-1)。

我希望看到一种纯粹的函数式语言。 或者,我应该转移我的 POV 吗?

干杯,

托马斯

【问题讨论】:

    标签: erlang


    【解决方案1】:
    1. 您的示例中没有重新分配 - Counter-1 是一个新值,未分配给任何现有变量。
    2. Erlang 不是纯粹的函数式语言。

    【讨论】:

    • 你能详细说明#2吗? (反例就可以了)。
    • 嗯,有人认为 erlang 是函数式的,但可能不是纯的,因为多线程?这对我来说真的不是问题。据说 Haskell 是纯的,因为它不支持可变性。它还支持多线程并将副作用封装在 IO 值中。另外,什么是无副作用的语言?如果是关于不变性,那么 erlang 符合要求。如果是关于不支持任何形式的 IO,我认为这种语言是不存在的。
    【解决方案2】:
    loop(Value,Counter)-> io:format("~s,~n",[Value]), loop(Value,Counter-1).
    

    在上面的函数定义中,函数本身的名称出现在定义的右侧,并且使用相同的arity。我们称这种类型的定义为递归定义。每个递归调用都将定义一个名为Counter 的值,该值仅在当前递归级别中可见。换句话说,与表达式 Counter - 1 的求值对应的数字将绑定到一个 new Counter 变量,在范围方面与表达式中使用的变量无关。

    但是,这种类型的递归函数调用称为tail-recursive。这是一种特定类型的调用,具有可优化到真实循环的特性。最终结果是函数使用的Counter 的内存单元将使用新值更新并用于递归调用,而不是为新的Counter 值再次分配(1)。这允许潜在的无限递归方案。


    关于函数式语言的概念,如果不首先正确定义什么是函数式语言,以及什么是纯函数式,就很难回答这个问题。

    在我的书中,函数式语言是一种基于 lambda 演算概念的语言:函数抽象和应用,高阶函数:这也称为函数作为语言的一等公民。 Erlang 绝对适合该模型。纯 FL 可能不支持另一种主要的编程范式,即命令式(可变可变性)。 Erlang 再次符合这个定义。如果你有不同的定义,那么Erlang的情况可能会有所不同。

    Pascal 在 cmets 部分指出,Erlang 中有一个不遵循纯函数式语言范式的工具: Process dictionaries。实际上,可以在该结构中设置值,如前所述:

    注意使用过程字典:

    • 破坏参考透明度

    • 使调试变得困难

    • 在接球/投掷中幸存下来

    (强调我的)。

    因此,Erlang 不是严格纯粹的。


    (1) 尾递归并不是实现该优化的唯一方法:请参阅 http://learnyousomeerlang.com/recursion

    【讨论】:

    • 非常感谢您的回答。您将我的 POV 设置在正确的角度。非常感谢:)))
    • 没问题:矩阵有时会在设置项目时产生误导 (^-^)
    • 我冒昧地根据我对函数式语言的理解来更新我的答案。如果这对您不正确,请告诉我,并可能更新您的问题以反映您对该想法的看法。
    • 在纯函数式语言的定义中,我们可以包括没有副作用。对于最后一点,Erlang 中有一个已知的例外:进程字典。这非常方便,例如评估伪随机值而不在每次函数调用时传递当前种子,但通常不建议使用它。
    • @Pascal 感谢您的意见,我不知道这一点,我可能应该将其包含在我的回答中。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-02-21
    • 2015-05-18
    • 2016-03-26
    • 2021-12-04
    • 2011-05-29
    • 2015-09-19
    相关资源
    最近更新 更多