4> abs(1).
1
5> X = abs.
abs
6> X(1).
** exception error: bad function abs
7> erlang:X(1).
1
8>
Run Code Online (Sandbox Code Playgroud)
当我用变量调用函数时,是否有任何特殊原因需要使用模块名称?这对我来说不起作用,因为,有一件事,它只是太多的句法垃圾,让我的眼睛流血.另一方面,我计划从列表中调用函数,例如(在我的头顶):
[X(1) || X <- [abs, f1, f2, f3...]].
Run Code Online (Sandbox Code Playgroud)
试图在这里使用各种模块名称会使冗长度达到顶峰,而我所做的全部工作就是减少冗长.
编辑:看这里:http://www.erlangpatterns.org/chain.html这家伙已经取得了一些管道功能.他按照我想要的方式调用函数,但是当我尝试使用它时,他的代码不起作用.但据我所知,这个人是一位经验丰富的Erlang程序员 - 我看到他在会议上发表了一些主题演讲或其他内容(我在网上看到了).
这种东西过去是否有用但不再适用?当然有一种方法可以做我想做的事 - 调用这些函数而不需要冗长和样板.
编辑:如果我正确阅读文档,似乎暗示我的顶部示例应该工作(第8.6节)http://erlang.org/doc/reference_manual/expressions.html
小智 7
在表达式中X=abs,abs不是函数而是原子.如果你想这样定义一个函数,你可以这样做:
D = fun erlang:abs/1.
Run Code Online (Sandbox Code Playgroud)
或者:
X = fun(X)->abs(X) end.
Run Code Online (Sandbox Code Playgroud)
我知道abs是一个原子,而不是一个函数.[...]为什么使用模块名称时它会起作用?
文档解释了(稍微重组):
Run Code Online (Sandbox Code Playgroud)ExprM:ExprF(Expr1,...,ExprN)每个
ExprM且ExprF必须是原子或表达式,其计算结果为原子.据说通过使用完全限定的函数名称来调用该函数.Run Code Online (Sandbox Code Playgroud)ExprF(Expr1,...,ExprN)
ExprF必须是一个原子或评价一个有趣的.如果ExprF是一个原子,则称该函数通过使用隐式限定的函数名称来调用.
X到一个原子:X = atom.这正是你提供的.X到函数:X = fun module:function/arity.