function - 为什么 Erlang 元组模块有争议?

标签 function module erlang tuples call

有人问过类似的问题 Parameterised Modules in Erlang ,它是关于“什么”。我的问题是关于“为什么”?

OTP Technical Board - Decisions affecting R16包含有关此问题的董事会决定,但我不知道该决定背后的原因。

Stateful Module in Programming Erlang 2ndEdition by Joe Armstrong详细介绍了这个功能,但看不出作者的态度。

如果我们阅读官方文档Function Calls ,我们看到这个特征是故意略读的。其实官方文档强烈反对使用这个功能,引用efficiency function calls .如果是这样,为什么乔·阿姆斯特朗在他的书中提到了这样的特征?

我觉得这个功能很棒。正如上面提到的书,我的客户端代码可能如下所示

Obj:find(Key),
Obj:is_key(Key),

那么,我们不关心 Objdict:new() 创建, 或 gb_tree:new() ,不幸的是,dictgb_tree不要共享一致的界面,例如我们有 gb_tree:lookup而不是 gb_tree:find .

最佳答案

我无法告诉你控制一切的大 cabal 内部的讨论是什么,但我可以告诉你一些我从未考虑使用此功能的原因:

  • 它不适合。 Erlang 是功能性的,这是对 OOP 风格的结构体的奇怪介绍,这种结构体具有 ARM 和腿之类的东西。我不喜欢我的代码与自身发生冲突。
  • 它引入了句法复杂性和语义模糊性,但没有赋予我新的超能力。
  • 复杂:
  • “现在 X 的属性 Foo 等于 10 还是 20?”
  • “为什么我在这里写dict:is_key(Value, Thingy),然后在那边写Thingy:is_key(Value)
  • “我真的想一直遇到像 dict:is_key(Key, Foo:get_value(Key2)) 这样的代码吗?”
  • 我已经有一大群流程旨在做到这一点,并将状态的复杂性从流程代码中移到异步消息的世界中(在代码中,我可以在一次函数调用中处理孤立的时间快照) ...
  • 如果我真的需要这不是流程字典的用途吗?
  • 歧义:
  • “这是我正在调用的方法或模块函数的‘事物’吗?”
  • “等等,这不应该是功能性的吗?”
  • “把它放在一个闭包里然后把它送到别的地方可以吗?如果‘别的地方’是另一个节点怎么办?我必须突然开始关心这个吗?”
  • 这引入了不透明状态(坏)而不是 ADT(好,我们已经拥有的东西)。
  • 没有人使用它,所以为什么要浪费精力来支持它,尤其是考虑到它可能带来的极端情况。这是支持开销和工作量,我宁愿看到我们都使用的功能。
  • 这里的“ yield ”仅被认为是对那些不忍心放弃 Java 主义的人的好处。 Foo:is_key(Key) 之间没有太大区别比 dict:is_key(Key, Foo) .除了我在第一次阅读时确定,即使在完全没有上下文的情况下,在第二个版本中操作的数据对象绝对是一个字典。

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

    关于function - 为什么 Erlang 元组模块有争议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31954796/

    相关文章:

    python - 如何在 linux 中包含 python 模块?

    循环内的 JavaScript 函数

    r - 使用 for 循环创建一个函数来比较多项式回归中多项式的次数

    python - 如何将字符串变量从一个函数传递到另一个函数?

    haskell - Haskell 和 Erlang 中的模式匹配

    erlang - net_kernel :start fails with `{' EXIT', nodistribution}`

    erlang - Dialyzer 说函数永远不会被调用,即使它是

    function - 为 fn 类型实现特征

    Python:AttributeError 模块 x 没有属性 y

    ruby-on-rails - 如何在 RSpec 中包含多个模块?