【问题标题】:Elixir: rationale behind allowing rebinding of variablesElixir:允许重新绑定变量的基本原理
【发布时间】:2016-05-20 03:48:13
【问题描述】:

当 Erlang 不允许时,允许在 Elixir 中重新绑定变量的基本原理是什么?

【问题讨论】:

    标签: erlang elixir


    【解决方案1】:

    大多数函数式语言不允许在同一范围内重新绑定变量。所以 Elixir 允许这样做肯定会给它一种非功能性的、命令式的感觉。 Erlang 的问题是缺少范围,或者更准确地说,整个函数子句中只有一个范围。我们确实就是否引入范围进行了认真的讨论,但最终我们决定反对它,因为它与现有系统向后不兼容。并且开发人员讨厌向后不一致的更改。

    Erlang 方法有一个重要的好处:当你出错时,你通常会得到一个错误,因此你可以看到错误。相比之下,当变量没有您期望它具有的值时会出现奇怪的行为,这非常更难检测和纠正。

    我个人认为新变量名称的问题,例如使用数字方案,被夸大了。与我解决什么所花费的时间相比,我将要做的更改变量名称是微不足道的。过了一会儿,你只是看到它而不反思它。老实说。

    编辑:

    此外,当通过一系列函数链接数据时,数据的实际含义会发生变化,因此重用相同的变量名可能会产生很大的误导。它最终可能只是意味着一个通用的“我从一个函数传递到另一个函数的数据”。

    【讨论】:

    • 同意。我认为带有编号变量的示例要么是人为的,要么只是显示编码不佳。反复将一个函数的结果作为参数传递给下一个函数需要折叠,而不是重新绑定变量。
    • @SteveVinoski 或者它呼唤流水线,这是一些 FP 语言已经采用的想法。
    • @OnorioCatenacci 我对术语“流水线”及其所指的内容有疑问。对我作为一个老 Unix 用户和并发程序员来说,“管道”这个词尖叫着并发性和并行性,而它在某些函数式语言中的定义方式与这两者无关。它只是用作嵌套函数调用的语法糖。虽然这本身可能很有用,但它应该被称为别的东西,这个术语将失去所有意义。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      因为它更简单。

      看一下this question 2009 年发布到 Erlang 邮件列表的内容。具体来说这部分:


      在大多数情况下,我喜欢模式匹配,但我发现我会写 足够的代码,我需要增量更新数据结构,以及 当我有这样的代码时,维护该代码是一件痛苦的事情:

      X = foo(),
      X1 = bar(X),
      X2 = xyzzy(X1),
      blah(X2).
      

      以后想改成:

      X = foo(),
      X1 = whee(X),
      X2 = bar(X1),
      X3 = xyzzy(X2),
      blah(X3).
      

      编者注——这是对该问题的答复。

      这经常通过 IRC。这是变量命名不佳的结果 实践,无需引入重新绑定来“修复”它; 停止使用单个字母和计数器作为变量名。

      如果是这样写的

       FooStateX    = foo(),
       PostBarX     = bar(FooStateX),
       OnceXyzziedX = xyzzy(PostBarX),
       blah(OnceXyzziedX).
      

      代码表明在 Erlang 中并不少见(注意“这经常通过 IRC”)。 Elixir 简单地重新绑定名称的能力使我们不必一直为事物生成新的虚拟名称。就这样。请记住,Erlang 的最初创建者并没有尝试构建函数式语言。他们只是有问题要解决的务实的开发人员。 Elixir 的方法是简单的实用主义。

      【讨论】:

      • 是的,但是重新绑定意味着我失去了变量的独特含义。我现在必须真正扫描所有代码以找出变量的含义。这使事情复杂化了。我认为这比必须生成新名称更糟糕。此外,当通过实际的含义传递数据时,可能会发生变化,因此重用变量名称意味着它只是变成了一个虚拟名称。
      • 这是罗伯特的一次有趣的对话,当然我更愿意在一个我们有更多空间阐述我们对此想法的论坛上进行对话。我完全理解你的意思,但也有一些务实的问题;允许重新绑定是比功能纯度更实用的方法的地方。
      • Onorio 在 elixir 邮件列表上开始讨论它,我会参与其中。
      猜你喜欢
      • 1970-01-01
      • 2016-03-14
      • 2018-02-12
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多