为什么Erlang在其进口中有arity?
我发现Erlang的模块arity import为什么Erlang在其进口中有arity?,erlang,Erlang,我发现Erlang的模块arity import/n,其中n是参数的数量,这相当奇怪 在Java和各种其他语言中,您可以执行以下操作: import static com.stuff.Blah.myFunction; 它将导入所有重载的Blay.myFunction(..),而不考虑参数 除此之外,我想明确为什么语言设计师认为这是一个好主意(我不是想批评语言…只是好奇) 这与代码交换有关吗 或者它与隐藏递归的保护方法有关?如果是这样,为什么不允许在出口时使用arity,但在进口时不需要ari
/n
,其中n是参数的数量,这相当奇怪
在Java和各种其他语言中,您可以执行以下操作:
import static com.stuff.Blah.myFunction;
它将导入所有重载的Blay.myFunction(..)
,而不考虑参数
除此之外,我想明确为什么语言设计师认为这是一个好主意(我不是想批评语言…只是好奇)
- 这与代码交换有关吗
- 或者它与隐藏递归的保护方法有关?如果是这样,为什么不允许在出口时使用arity,但在进口时不需要arity
- 我为什么要那么明确?即导入两个参数函数,而不是
的三个参数myFunction
module:function
,比如Class.staticMethod
或者它与隐藏递归的保护方法有关
不,因为不导入函数不会以任何方式隐藏它们
这与代码交换有关吗
有点。Erlang中的模块是单独编译的(这是允许代码交换的一部分),与Java类不同,因此编译器不知道有多少版本的导入函数具有不同的算术。当然,它可以假设具有给定名称的函数的所有调用都来自同一个模块,但设计者可能认为它不是特别有用
事实上,您几乎不想使用导入,至少在我的经验中是这样,就像您很少在Java中使用静态导入一样。只需编写module:function
,比如Class.staticMethod
或者它与隐藏递归的保护方法有关
不,因为不导入函数不会以任何方式隐藏它们。Erlang最初是在Prolog中开发的 在Prolog中,这些重要性为你所认为的“参数”添加了额外的含义,正如我从程序语言中的“函数”理解的那样。但这种模式在这里并不适用 所谓的‘已婚(X,Y)’和‘已婚(X,Y,Z)’意味着一种不同的‘已婚’关系,可以称之为已婚/2和已婚/3 在过程编程中,“add(a,b)”或“add(a,b,c)”用于生成不同数量的参数的添加。在Prolog中,情况并非如此,在Prolog中,可以将关系“a和b,added”或“a,b和c,added”表示其他意思。不用说,Prolog允许您像预期的那样声明“add”。但它允许更多。更多可用的含义,意味着更需要控制它
与任何模块系统一样,选择要向外部客户机公开的内容是有意义的:因此声明了arity Erlang最初是在Prolog中开发的 在Prolog中,这些重要性为你所认为的“参数”添加了额外的含义,正如我从程序语言中的“函数”理解的那样。但这种模式在这里并不适用 所谓的‘已婚(X,Y)’和‘已婚(X,Y,Z)’意味着一种不同的‘已婚’关系,可以称之为已婚/2和已婚/3 在过程编程中,“add(a,b)”或“add(a,b,c)”用于生成不同数量的参数的添加。在Prolog中,情况并非如此,在Prolog中,可以将关系“a和b,added”或“a,b和c,added”表示其他意思。不用说,Prolog允许您像预期的那样声明“add”。但它允许更多。更多可用的含义,意味着更需要控制它
与任何模块系统一样,选择要向外部客户机公开的内容是有意义的:因此声明了arity 您应该了解在Erlang中导入函数的真正作用。这是一种纯文本转换。如果我执行一个
-import(foo[bar/1,baz/2])。
这意味着当我编写一个类似bar(5)
或baz(a,3)
的调用时,编译器会将它们转换为foo:bar(5)
和foo:baz(a,3)
。这就是它所做的,没有别的。它不检查任何内容:
- 它不检查模块
是否包含功能foo
或bar/1
baz/2
- 它甚至不检查模块
是否存在foo