为什么Erlang元组模块存在争议?

wcy*_*wcy 7 erlang tuples module function call

一个类似的问题被问到Erlang中的参数化模块,它是关于"什么".我的问题是"为什么"?

OTP技术委员会 - 影响R16的决定包含董事会对此问题的决定,但我不知道该决定背后的原因.

编程中的状态模块Erlang 2ndEdition由Joe Armstrong详细介绍了这个特性,但我没有看到作者的态度.

如果我们阅读官方文档函数调用,我们会看到此功能是故意浏览的.事实上,官方文档强烈反对使用此功能,请参阅效率函数调用.如果是这样,为什么乔·阿姆斯特朗在他的书中提到了这样的特征呢?

我认为这个功能非常棒.如上所述,我的客户端代码如下所示

Obj:find(Key),
Obj:is_key(Key),
Run Code Online (Sandbox Code Playgroud)

然后,我们不关心是否Objdict:new(),或者gb_tree:new()不幸地创建,dict并且gb_tree不共享一致的 界面,例如我们gb_tree:lookup而不是gb_tree:find.

zxq*_*xq9 7

我不能告诉你在控制一切的Great Cabal中的讨论是什么,但我可以告诉你为什么我从未考虑过使用这个功能:

  1. 它不适合.Erlang是功能性的,这是一个奇怪的OOP风格的结构 - 有武器和腿的东西.我不喜欢我的代码与自己发生冲突.
  2. 它引入了句法复杂性和语义歧义,但没有给我新的超级大国.

    • 复杂:

      1. "就是属性XFoo10个或20个相等的权利吗?"
      2. "为什么我dict:is_key(Value, Thingy)在这里写,然后Thingy:is_key(Value)在那边写?
      3. "我真的想要像往常一样遇到代码dict:is_key(Key, Foo:get_value(Key2))吗?"
      4. 我已经拥有了大量的流程,旨在实现这一目标,并将状态的复杂性从流程代码转移到异步消息的世界中(在代码中,我可以在单个函数调用中处理孤立的时间快照) ...
      5. 如果我真的需要这不是流程词典的用途吗?
    • 歧义:

      1. "这是''''我称之为方法,或者我正在调用的模块函数?"
      2. "等等,这不应该是功能性的吗?"
      3. "把它放在关闭状态并将其发送到其他地方是否可以?如果'其他地方'是另一个节点怎么办?我是否必须立即开始关心它?"
  3. 这引入了不透明状态(坏)而不是ADT(好的,我们已经拥有的东西).

  4. 没有人使用它,所以为什么浪费精力支持它,特别是考虑到它可能带来的极端情况.这是支持的开销和精力,我宁愿看到进入我们所有的功能使用.
  5. 这里的"收益"只被认为是对无法忍受Java主义的人们的好处.没有太大的区别Foo:is_key(Key)不是dict:is_key(Key, Foo).除了我确信在第一次阅读时,即使在完全没有上下文的情况下,在第二版中操作的数据对象肯定是一个字典.

Erlang的符号赋值(又名"单一赋值")很棒,为什么要破坏它?