2012-04-06 4 views
5

W ERLANG: Załóżmy, że mamy funkcję f(), która przyjmuje F1 jako wejścia, gdzie F1 jest funkcją. Czy istnieje sposób na poznanie liczby parametrów wejściowych F1.Znając liczbę parametrów przekazanej funkcji (erlang)

Czuję, że jakoś tam jest rozwiązanie, ale nie jestem pewien. na przykład:

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

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

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

Więc, czy jest jakiś sposób na funkcję biegu/1, aby wiedzieć, informacje o przekazany funkcji [głównie liczby parametrów wejściowych funkcji przeszedł].

Uwaga: Należy pamiętać, że jest to pytanie teoretyczne. Uwaga: jest kod stosowania (zabawa, [argumenty]) dostępne w open-source .. to może mnie przekonać.

Odpowiedz

12

erlang: fun_info (Zabawa, arity).

Na przykład

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

Można użyć module_info/1, aby uzyskać informacje o module.

module_info/1

Połączenie module_info(Key) gdzie Key oznacza atom powraca jeden element informacji o module.

Poniższe wartości są dozwolone dla Key:

...

exports Zwraca listę {nazwa}, Arity krotki ze wszystkich eksportowanych funkcji w module.

functions Powoduje zwrócenie listy krotek {Name, Arity} ze wszystkimi funkcjami w module.

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.