如何用变量调用Erlang函数?

use*_*020 3 erlang

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)


Syl*_*oux 7

我知道abs是一个原子,而不是一个函数.[...]为什么使用模块名称时它会起作用?

文档解释了(稍微重组):

ExprM:ExprF(Expr1,...,ExprN)
Run Code Online (Sandbox Code Playgroud)

每个ExprMExprF必须是原子或表达式,其计算结果为原子.据说通过使用完全限定的函数名称来调用该函数.

ExprF(Expr1,...,ExprN)
Run Code Online (Sandbox Code Playgroud)

ExprF 必须是一个原子或评价一个有趣的.如果ExprF是一个原子,则称该函数通过使用隐式限定的函数名称来调用.

  • 当使用完全限定的函数名时,Erlang期望求值为原子的原子表达式.换句话说,你必须绑定X到一个原子:X = atom.这正是你提供的.
  • 但在第二种形式中,Erlang期望一个原子或一个表达式来计算一个函数.注意最后一个字.换句话说,如果您使用完全限定的函数名称,则必须绑定X到函数:X = fun module:function/arity.