2016-04-29 13 views
1

関数のリストを作成して別の関数の引数として送信し、このリスト内の一部の関数にこのリストの他の関数を呼び出しさせることはできますか?
たとえば、引数として渡されたリストで動作する関数を必要とし、このリストの関数のリストで最初の関数を実行し、その関数がそのリスト内の他の関数を呼び出すと、検索して使用することができます。関数リストとその実行Erlang

例:偏差(数字、ファンクション) - >%関数= [楽しいマスター/ 1/1平均楽しい、楽しいmeanroots/1]
マスターは、次に等meanrootsへしかしにその結果を渡し、平均を呼び出しコールチェーンの終わりは、マスターが値を返すものです。

機能的に可能かどうかは、OTP単独でもNIFでも、見たい実装サンプルがあるかどうかを知りたいのですが。

答えて

2

リスト内の関数の1つがリスト内の別の関数と呼ばれているかどうかを関数がどのように知っていますか?あなたの質問は混乱していると思います。

あなたはチェーンに一連の機能による結果の関数を作成することができます。

chain(Nums, []) -> Nums; 
chain(Nums, [H | T]) -> chain(H(Nums), T). 

標準機能で行うことができます。もちろん

lists:foldl(fun (F, V) -> F(V) end, Nums, Funcs) 
2

次のことができます。

1> F1 = fun(A) -> A*A end. 
#Fun<erl_eval.6.50752066> 
2> F2 = fun(A) -> A+A end. 
#Fun<erl_eval.6.50752066> 
3> F3 = fun(A) -> A*A+A end. 
#Fun<erl_eval.6.50752066> 
4> Funs = [F1, F2, F3]. 
[#Fun<erl_eval.6.50752066>,#Fun<erl_eval.6.50752066>, 
#Fun<erl_eval.6.50752066>] 
5> [F(X) || X <- [1,2,3], F <- Funs]. 
[1,2,2,4,4,6,9,6,12] 

タグ付きタプルを関数で作成することができます。 {tag1, F1}(ここではF1は上記のように定義されています)、それらを関数に渡し、Erlangの他の変数で通常行うすべての処理を行います。