oxb*_*kes 16 erlang functional-programming immutability
我最近一直在阅读有关函数式语言的文章.在10多年的OO开发过程中,我发现很难理解人们如何能够指出纯粹的功能方法(即使用相同参数调用相同的方法做同样的事情) (在OO程序中)我需要缓存数据.
我们是否承认在程序中可能需要一个不可变的actor(即缓存).我刚看了Joe Armstrong关于infoq的演讲,他在这方面看起来很教条!
我们是否只是承认查找数据可能很昂贵(因为我们永远无法缓存它)?如果是这样,我们如何控制,例如,某些共享资源(例如数据库)上的负载
是否有一些神奇的尘埃,我还不知道,这解决了整个问题,然后喝了一杯好茶.
当然谷歌搜索"Erlang Cache"似乎返回了一些公平的结果......
在 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.
Run Code Online (Sandbox Code Playgroud)
当您调用 时put_c,参与者的“状态”会发生变化,即使涉及的所有数据都是不可变的。