Erlang 长生不老药:允许变量重新绑定的基本原理

Erlang 长生不老药:允许变量重新绑定的基本原理,erlang,elixir,Erlang,Elixir,当Erlang不允许在Elixir中重新绑定变量时,允许在Elixir中重新绑定变量的理由是什么?,因为它更简单 看看2009年发布到Erlang邮件列表的邮件。具体而言,本部分: 在大多数情况下,我喜欢模式匹配,但我发现我会写 需要增量更新数据结构的足够代码,以及 当我有如下代码时,维护该代码是一件痛苦的事情: 以后要将其更改为: 编者按——这是对这个问题的回答。 这经常通过IRC。这是变量命名不当的结果 实践,并且没有必要引入重新绑定来“修复”它; 停止使用单个字母和计数器作为变量名 例如

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

,因为它更简单

看看2009年发布到Erlang邮件列表的邮件。具体而言,本部分:


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

以后要将其更改为:

编者按——这是对这个问题的回答。

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

例如,如果是这样写的



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

以下是直接从马口中得出的基本原理:


大多数函数式语言不允许在同一范围内重新绑定变量。因此,长生不老药允许这确实给它一种非功能性的,强制性的感觉。Erlang的问题是缺少作用域,或者更准确地说,在整个函数子句中只有一个作用域。我们确实认真讨论了是否引入范围,但最终我们决定反对,因为它与现有系统不兼容。开发人员讨厌向后不一致的更改

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

就我个人而言,我认为新变量名的问题,例如使用数字方案,被大大夸大了。与我计算出我要做什么所需的时间相比,更改变量名是微不足道的。过了一段时间,你只是看到它,而没有思考它。老实说

编辑:


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

同意。我认为带有编号变量的示例要么是人为设计的,要么只是显示了糟糕的编码。反复将一个函数的结果作为参数传递给下一个函数需要折叠,而不是变量重新绑定。@SteveVinoski或它需要流水线,这是一些FP语言所采用的思想。@OnorioCatenacci我对术语“流水线”及其指代有问题。作为一个老Unix用户和并发程序员,“管道”这个词呼喊着并发性和并行性,而在某些函数式语言中定义它的方式与这两者都无关。它只是用作嵌套函数调用的语法糖。虽然这本身可能是有用的,但它应该被称为其他东西,这个术语将失去所有意义。是的,但重新绑定意味着我失去了变量的唯一意义。我现在必须浏览所有的代码,找出一个变量刚才的意思。这使事情复杂化了。我认为这比产生新名字更糟糕。另外,当通过实际意义传递数据时,可能会发生变化,因此重用变量名意味着它只是一个虚拟名称。这是一个有趣的对话,Robert,当然我更希望在论坛上讨论,在论坛上我们有更多的空间来阐述我们的想法。我完全理解你的意思,但也有一些务实的问题;在某些地方,允许重新绑定是一种比功能纯度更为实用的方法。Onorio在elixir邮件列表上开始讨论它,我将开始讨论它。
X = foo(),
X1 = bar(X),
X2 = xyzzy(X1),
blah(X2).
X = foo(),
X1 = whee(X),
X2 = bar(X1),
X3 = xyzzy(X2),
blah(X3).
 FooStateX    = foo(),
 PostBarX     = bar(FooStateX),
 OnceXyzziedX = xyzzy(PostBarX),
 blah(OnceXyzziedX).