如何用变量调用Erlang函数?

How to invoke Erlang function with variable?

4> abs(1).
1
5> X = abs.
abs
6> X(1).
** exception error: bad function abs
7> erlang:X(1).
1
8>

当我调用带有变量的函数时,是否有任何特殊原因导致我必须使用模块名称?这对我不起作用,因为,一方面,它只是语法垃圾太多,让我的眼睛流血。另一方面,我计划从列表中调用函数,比如(不在我的脑海中):

[X(1) || X <- [abs, f1, f2, f3...]].

尝试在此处添加各种模块名称将使冗长的内容达到顶峰,而我所做的全部目的是减少冗长。

编辑:看这里:http://www.erlangpatterns.org/chain.html 这家伙做了一些 pipe-forward 功能。他正在按照我上面想要的方式调用函数,但是当我尝试使用他的代码时,他的代码不起作用。但据我所知,这个人是一位经验丰富的 Erlang 程序员 - 我看到他在会议上做了一些主题演讲或其他内容(我在网上看到的)。

这种东西以前有用现在不行了吗?当然有一种方法可以让我做我想做的事——调用这些函数而无需所有冗长和样板文件。

编辑:如果我没有正确阅读文档,这似乎意味着我在顶部的示例应该有效(第 8.6 节)http://erlang.org/doc/reference_manual/expressions.html

表达式X=abs中,abs不是函数而是原子。如果你想这样定义一个函数,你可以这样做:

D = fun erlang:abs/1.

左右:

X = fun(X)->abs(X) end.

尝试:

X = fun(Number) -> abs(Number) end.

更新:

仔细查看讨论后,您似乎想要对某些输入应用多个函数。

有两个项目我个人没有用过,但我已经在 Github 上加过星标,这可能是您要找的。

这两个项目都使用解析转换:

管道是独一无二的,因为它使用了特殊的语法:

Result = [fun1, mod2:fun2, fun3] (Arg1, Arg2).

当然,也可以使用 {module, function} 元组列表编写自己的函数来执行此操作,并将该函数应用于先前的输出,直到获得结果。

I know abs is an atom, not a function. [...] Why does it work when the module name is used?

The documentation 解释说(稍微重组):

ExprM:ExprF(Expr1,...,ExprN)

each of ExprM and ExprF must be an atom or an expression that evaluates to an atom. The function is said to be called by using the fully qualified function name.

ExprF(Expr1,...,ExprN)

ExprF must be an atom or evaluate to a fun. If ExprF is an atom the function is said to be called by using the implicitly qualified function name.

  • 当使用完全限定的函数名时,Erlang 期望 atomsexpression 计算结果为 atoms.换句话说,您必须将 X 绑定到 atomX = atom. 这正是您提供的。
  • 但是在第二种形式中,Erlang 期望 atomexpression 计算结果为 function。注意最后一句话。换句话说,如果您 而不是 使用完全限定的函数名称,则必须将 X 绑定到一个函数:X = fun module:function/arity.