[英]Why does Erlang have arity in its imports?
我发现Erlang的模块arity import /n
,其中n是参数数量,这很奇怪。
在Java和其他各种语言中,您可以执行以下操作:
import static com.stuff.Blah.myFunction;
它将导入所有重载的Blay.myFunction(..)
而不考虑参数。
此外,我猜想很明确,为什么语言设计师认为这是个好主意(我不是想批评这种语言,只是好奇)?
myFunction
的三个参数? 您应该知道Erlang中的导入功能实际上是做什么的。 这是纯粹的文字转换 。 如果我执行-import(foo, [bar/1,baz/2]).
这意味着当我编写类似bar(5)
或baz(a, 3)
的调用时baz(a, 3)
编译器会将它们转换为foo:bar(5)
和foo:baz(a, 3)
。 这就是它所做的一切,仅此而已。 它不检查任何内容:
foo
包含功能bar/1
或baz/2
。 foo
存在。 实际上,它所做的只是隐藏您在另一个模块中调用一个函数。 这就是为什么有经验的Erlangers的建议是“不要使用”。 那是一个错误。 不幸的是,添加愚蠢的东西要比摆脱它们容易得多,因此我们无法将其删除。
“这与代码交换有关吗?”
是的,有点。 Erlang中所有代码处理的单位是模块。 因此,您可以编译模块,加载模块,清除和删除模块。 这意味着系统中根本没有模块间的依赖关系,并且编译器在编译模块时不对其他模块做任何假设。 没有假设模块的编译环境与运行环境相同。 这就是为什么在运行时系统会检查您尝试在另一个函数中调用的函数是否存在,或者模块本身是否存在的原因。 这就是为什么import
是纯文本转换的原因。
Erlang最初是在Prolog中开发的。
在Prolog中,礼节性增加了过程编程语言中您认为是“从函数中理解的参数”的含义。 但是该模型不适用于此处。
所谓子句“ married(X,Y)”。 和“已婚(X,Y,Z)”。 暗示另一种“已婚”关系,可以宣布为已婚/ 2和已婚/ 3。
在过程编程中,“ add(a,b)”或“ add(a,b,c)”旨在生成不同数量的参数的加法。 在Prolog中并不是立即出现这种情况,在这种情况下,可能使“添加的a和b”或“添加的a,b和c”的关系具有其他含义。 不用说,Prolog允许您像期望函数那样声明'add'。 但它允许更多。 更多可用的含义意味着更多地需要对其进行控制。
就像在任何模块系统中一样,选择要向外部客户端公开的内容是有道理的:因此声明了arity。
它与代码交换有关吗?
的种类。 与Java类不同,Erlang中的模块是单独编译的(这是允许代码交换的一部分),因此,编译器不知道存在多少个带有不同Arity的导入函数版本。 当然,可以假定具有给定名称的函数的所有调用都来自同一模块,但是设计人员可能认为它不是特别有用。
实际上,至少从我的经验来看,您几乎根本不想使用导入,就像您很少在Java中使用静态导入一样。 只需编写module:function
,如Class.staticMethod
。
还是与隐藏递归的保护方法有关?
不,因为不导入函数不会以任何方式隐藏它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.