2012-04-06 80 views
5

在ERLANG中:假设我们有一个函数f(),它将F1作为输入,其中F1是一个函数。有没有办法知道F1的输入参数数量。知道传递函数的参数数量(erlang)

我觉得不知何故有一个解决方案,但我不知道。例如:

-module(high). 
-compile(export_all). 

f1() -> 1. 
f2(X) -> X. 
f3(X, Y) -> {X,Y}. 

run(F) -> io:format("F ~p ~n", [F]). 

那么,有没有什么办法的功能运行/ 1了解的传递函数[主要的功能通过输入参数的个数]信息。

注意:请注意,这是一个理论问题。 注意:是适用的代码(乐趣,[参数])在开放源代码中可用..这可能帮我猜。

回答

12

erlang:fun_info(Fun,arity)。

例如

F = fun(A,B) -> A+B end. 
#Fun<erl_eval.12.111823515> 
3> erlang:fun_info(F,arity). 
{arity,2} 
0

您可以使用module_info/1获得有关你的模块的信息。

module_info/1

呼叫module_info(Key),其中Key是一个原子,返回一个单件的有关模块的信息。

以下值允许Key

...

exports 返回{名称,元数}列表与模块中的所有导出函数的元组。

functions 返回模块中包含所有函数的{Name,Arity}元组的列表。

http://erlang.org/doc/reference_manual/modules.html


run(F) -> find_value(F,module_info(exports)). 

find_value(Key, List) -> 
    case lists:keyfind(Key, 1, List) of 
     {Key, Result} -> {Key,Result}; 
     false -> io:format("There is no function called ~w.~n", [Key]) 
    end.