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这家伙已经取得了一些管道功能。他按照我想要的方式调用函数,但是当我尝试使用它时,他的代码不起作用。但据我所知,这个人是一位经验丰富的Erlang程序员 - 我看到他在会议上发表了一些主题演讲或其他内容(我在网上看到了)。
这种事情曾经发挥作用但不再适用吗?当然有一种方法可以做我想做的事情 - 在没有冗长和样板的情况下调用这些函数。
编辑:如果我正确阅读文档,似乎暗示我顶部的示例应该有效(第8.6节)http://erlang.org/doc/reference_manual/expressions.html
答案 0 :(得分:7)
在表达式X=abs
中, abs 不是函数,而是原子。如果你想这样定义一个函数,你可以这样做:
D = fun erlang:abs/1.
左右:
X = fun(X)->abs(X) end.
答案 1 :(得分:7)
我知道abs是一个原子,而不是一个函数。 [...]为什么在使用模块名称时它会起作用?
The documentation解释了(略微重组):
ExprM:ExprF(Expr1,...,ExprN)
ExprM
和ExprF
中的每一个必须是原子或表达式 评估原子。据说这个函数是通过使用来调用的 完全限定的功能名称。ExprF(Expr1,...,ExprN)
ExprF
必须是一个原子或评价一个有趣的。 如果ExprF是一个原子,则说该函数是使用隐式限定的函数名称调用的。
X
绑定到 atom :X = atom.
这正是您提供的内容。 X
绑定到函数:X = fun module:function/arity.
答案 2 :(得分:1)
尝试:
X = fun(Number) -> abs(Number) end.
<强>更新强>
在更多地讨论讨论之后,您似乎想要将多个功能应用于某些输入。
我个人没有使用过两个项目,但我已经在Github上出演过你可能正在寻找的项目。
这两个项目都使用解析转换:
Pipeline是唯一的,因为它使用特殊语法:
Result = [fun1, mod2:fun2, fun3] (Arg1, Arg2).
当然,也可以使用{module, function}
元组列表编写自己的函数来执行此操作,并将函数应用于上一个输出,直到得到结果。