Function 有没有一种方法可以返回一个可以有不止一个arity的乐趣?
Erlang函数可以共享相同的名称,但具有不同的arity。例如:Function 有没有一种方法可以返回一个可以有不止一个arity的乐趣?,function,erlang,arity,Function,Erlang,Arity,Erlang函数可以共享相同的名称,但具有不同的arity。例如: name(X) -> X. name(X,Y) -> X * Y. 我希望能够从一个以同样方式运行的函数返回一个乐趣 在本例中,我希望有一种方法将fun/1和fun/2作为一个返回返回,因此返回的fun可以以任何一种方式调用,与上面的函数示例完全相同 function() -> fun(X) -> X end, fun(X,Y) -> X * Y end. 我可以返回一个元组{F
name(X) -> X.
name(X,Y) -> X * Y.
我希望能够从一个以同样方式运行的函数返回一个乐趣
在本例中,我希望有一种方法将fun/1和fun/2作为一个返回返回,因此返回的fun可以以任何一种方式调用,与上面的函数示例完全相同
function() ->
fun(X) -> X end,
fun(X,Y) -> X * Y end.
我可以返回一个元组{F1,F2},但这很难使用
我可以返回一个以列表为参数的函数,但对于F([X])或F([X,Y])这样的调用,这也相当糟糕。这里有两个同名函数:
name(X) -> X.
name(X,Y) -> X * Y.
这两个函数作为匿名函数,分别是:fun name/1
和fun name/2
如果你把它们中的任何一个放在一个变量中,比如说…F1=fun name/1
或F2=fun name/2
,你以后就不能互换使用这些变量了,因为F1(1)
可以工作,但是F1(1,2)
会失败(反之亦然,F2
)
如果您不知道在运行时将收到的参数的数量(假设您收到一个可变长度的参数列表),那么您需要使用来动态计算函数。在这种情况下,我可以为您提供两种方法(取决于您喜欢的erlang:apply
版本):
使用apply/2:
use_name(Args) ->
Fun = function(length(Args)),
erlang:apply(Fun, Args).
function(1) -> fun(X) -> X end;
function(2) -> fun(X, Y) -> X * Y end.
use_name(Args) ->
erlang:apply(?MODULE, name, Args).
name(X) -> X.
name(X,Y) -> X * Y.
使用apply/3:
use_name(Args) ->
Fun = function(length(Args)),
erlang:apply(Fun, Args).
function(1) -> fun(X) -> X end;
function(2) -> fun(X, Y) -> X * Y end.
use_name(Args) ->
erlang:apply(?MODULE, name, Args).
name(X) -> X.
name(X,Y) -> X * Y.
希望这有帮助