Function 有没有一种方法可以返回一个可以有不止一个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

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.
我可以返回一个元组{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.
希望这有帮助