17

我最近读了一些关于函数式语言的书。经历了 10 多年的 OO 开发,我发现很难理解究竟如何将纯函数式方法(即使用相同参数调用的相同方法做同样的事情)指向一个问题,通常(在 OO 程序中)我需要缓存数据。

  • 我们是否只是承认程序中可能需要一个不可变的参与者(即缓存)。我刚刚在 infoq 上观看了 Joe Armstrong 的演讲,他在这方面似乎很教条!

  • 我们是否承认查找数据可能很昂贵(因为我们永远无法缓存它)?如果是这样,我们如何控制,例如,某些共享资源(例如数据库)的负载

  • 有没有一些我还不知道的魔法仙尘,解决了整个问题,然后泡了一杯好茶。

当然,谷歌搜索“Erlang Cache”似乎返回了相当多的结果......

4

3 回答 3

3

记忆功能。缓存只是一个列表/字典,因此可以以纯粹的功能方式实现。

于 2009-06-15T18:07:56.103 回答
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 回答