17

私は最近、関数型言語について少し読んでいます。オブジェクト指向の開発に 10 年以上携わってきた私は、純粋な関数型アプローチ(つまり、同じパラメーターで呼び出された同じメソッドが同じことを行う) をどのように指すことができるのか、理解するのが難しいと感じています。 (オブジェクト指向プログラムで) データをキャッシュする必要があります。

  • 不変ではないアクター (つまりキャッシュ) がプログラムに必要になる可能性があることを認めますか。infoq で Joe Armstrong のプレゼンテーションを見たところ、彼はこの点に関してかなり独断的だったようです。

  • データの検索にコストがかかる可能性があることを認めるだけですか (データをキャッシュすることはできないため)。もしそうなら、たとえば、共有リソース(データベースなど)の負荷をどのように制御できますか

  • 私がまだ知らない魔法の妖精の粉はありますか.

確かに、「Erlang Cache」をグーグルで検索すると、かなりの数の結果が返されるようです...

4

3 に答える 3

3

キャッシュと関数型言語が共存できない理由はありません。機能するためには、同じ引数で同じ関数を呼び出すと同じ答えが得られるという制約に従う必要があります。

例:get_data(Query、CacheCriteria)

get_dataがキャッシュを使用しているからといって、それが機能していないことを意味するわけではありません。同じQueryでget_dataを呼び出し、CacheCriteria引数が常に同じ値を返す限り、その言語は機能していると見なすことができます。

于 2009-06-15T19:52:38.350 に答える
3

アクターではなく、Erlang で不変でなければならないデータです。

寿命の長いアクターは通常、末尾再帰関数に存在し、その引数は状態として機能し、呼び出し間で確実に変化する可能性があります。

-module(cache).
-export([start/0, get_c/1, put_c/2, clear/1]).

start() -> register(spawn(fun () -> loop(dict:new()) end), cache).

loop(Dict) -> receive
                {get, From, Key} -> From ! {cache_result, Key, dict:fetch(Key, Dict)};
                {set, Key, Value} -> NewDict = dict:store(Key, Value, Dict),
                                     loop(NewDict);
                %% etc.
              end

put_c(Key, Value) -> cache ! {set, Key, Value}
%% etc.

を呼び出すとput_c、関連するすべてのデータが不変であっても、アクターの「状態」が変化します。

于 2009-06-16T07:11:38.553 に答える