2015-06-20 114 views
4
4> abs(1). 
1 
5> X = abs. 
abs 
6> X(1). 
** exception error: bad function abs 
7> erlang:X(1). 
1 
8> 

是否有什么特别的原因,当我用变量调用函数时必须使用模块名?这对我来说并不奏效,因为,有一件事,它只是太多的句法垃圾,让我的眼睛流血。另一件事,我计划在调用函数进行列表,像(把我的头顶部):如何用变量调用Erlang函数?

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

试图钉在这里的各种模块的名称将会使冗长通过屋顶,当时我所做的全部工作就是减少冗长。

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

这种事情曾经工作过,但不再是?当然有一种方法可以做我想做的事情 - 调用这些功能时没有所有的冗长和样板。

编辑:如果我在阅读文档的权利,这似乎在暗示,我在上面的例子应该工作(第8.6节)http://erlang.org/doc/reference_manual/expressions.html

+1

'X = ABS,X(1).'不起作用,因为没有按二郎” t考虑一个原子绑定到一个变量的函数。 'X = erlang,Y = abs,X:Y(1).'应该可以工作。分隔两部分的冒号告诉Erlang它是一个函数。 –

回答

8

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

The documentation解释说(略重组):

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

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

ExprF(Expr1,...,ExprN) 

ExprF 必须是一个原子或评估的乐趣。 如果ExprF是一个原子,则称该函数使用隐式限定的函数名称来调用。

  • 当使用完全限定的函数名,二郎预计原子表达式,其值原子。换句话说,您必须将X绑定到原子X = atom.这正是您所提供的。
  • 但在第二形式中,二郎预计任一种原子表达式计算结果为功能。注意最后一个字。换句话说,如果你不使用完全合格的函数名,你必须绑定X的功能:X = fun module:function/arity.
+0

“很清楚?”文档不太清楚,事实上我在发布之前发布了上述相同的文档。我认为这很混乱。话虽如此,我接受你的答案是正确的。 – user3355020

7

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

D = fun erlang:abs/1. 

左右:

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

要添加细节:为什么指定'Arity'的语法'fun M:F/Arity'的原因是因为Erlang允许许多函数具有相同的名称。函数的* unique *部分是函数名*和* arity *(需要多少个参数)。因此,只是函数名称不够具体,无法知道使用哪个函数;参数的名称和数量是必需的。 –

+0

@IGIVETERRIBLEADVICE,谢谢你的补充。 –

+1

我知道abs是一个atom.not一个函数。但是你使用一个原子作为名称来调用该函数。看看我上面的例子。为什么在使用模块名称时工作? – user3355020

2

尝试:

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

更新时间:

细算在更多的讨论中,似乎你想要将多个函数应用于某些inpu吨。

有两个项目我没有亲自使用过,但我已经在Github上出现过,这可能是您要找的。

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

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

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

当然,也可以写哟我们自己的函数使用元组列表{module, function}并将函数应用于先前的输出,直到得到结果。

+0

虽然这个答案可能是正确和有用的,但如果您包含一些解释并解释它是如何帮助解决问题的,那么它是首选。如果存在导致其停止工作并且用户需要了解其曾经工作的变化(可能不相关),这在未来变得特别有用。 –

+0

是的,我知道我可以做到这一点,但我不想这样做。我想要一个可以用来调用函数的原子列表。 – user3355020

+0

@ user3355020是不同模块中的功能,还是它们都在同一个模块中? –