Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Erlang在其进口中有arity?_Erlang - Fatal编程技术网

为什么Erlang在其进口中有arity?

为什么Erlang在其进口中有arity?,erlang,Erlang,我发现Erlang的模块arity import/n,其中n是参数的数量,这相当奇怪 在Java和各种其他语言中,您可以执行以下操作: import static com.stuff.Blah.myFunction; 它将导入所有重载的Blay.myFunction(..),而不考虑参数 除此之外,我想明确为什么语言设计师认为这是一个好主意(我不是想批评语言…只是好奇) 这与代码交换有关吗 或者它与隐藏递归的保护方法有关?如果是这样,为什么不允许在出口时使用arity,但在进口时不需要ari

我发现Erlang的模块arity import
/n
,其中n是参数的数量,这相当奇怪

在Java和各种其他语言中,您可以执行以下操作:

import static com.stuff.Blah.myFunction;
它将导入所有重载的
Blay.myFunction(..)
,而不考虑参数

除此之外,我想明确为什么语言设计师认为这是一个好主意(我不是想批评语言…只是好奇)

  • 这与代码交换有关吗
  • 或者它与隐藏递归的保护方法有关?如果是这样,为什么不允许在出口时使用arity,但在进口时不需要arity
  • 我为什么要那么明确?即导入两个参数函数,而不是
    myFunction
    的三个参数
这与代码交换有关吗

有点。Erlang中的模块是单独编译的(这是允许代码交换的一部分),与Java类不同,因此编译器不知道有多少版本的导入函数具有不同的算术。当然,它可以假设具有给定名称的函数的所有调用都来自同一个模块,但设计者可能认为它不是特别有用

事实上,您几乎不想使用导入,至少在我的经验中是这样,就像您很少在Java中使用静态导入一样。只需编写
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
    是否存在
实际上,它所做的只是隐藏您正在调用另一个模块中的函数。这就是为什么有经验的Erlangers建议“不要使用它”。这是一个错误。不幸的是,添加愚蠢的东西要比扔掉它们容易得多,所以我们永远无法删除它们

“这与代码交换有关吗?”

是的,有点。Erlang中all代码处理的单位是模块。因此,您可以编译模块、加载模块、清除和删除模块。这意味着系统中根本不存在模块间依赖关系,编译器在编译模块时不会对其他模块进行任何假设。没有假设编译模块的环境与运行模块的环境相同。这就是为什么在运行时,系统会检查您试图在另一个函数中调用的函数是否存在,甚至模块本身是否存在。就是