Как использовать кэшированные данные на функциональном языке, таком как Erlang? - PullRequest
16 голосов
/ 15 июня 2009

В последнее время я немного читал о функциональных языках. Исходя из более чем 10-летнего опыта разработки ОО, мне трудно понять, как на самом деле можно указать чисто функциональный подход (т.е. тот же метод, вызываемый с теми же параметрами, делает то же самое ) при проблеме, где обычно (в ОО-программе) мне нужно было бы кэшировать данные.

  • Допустим ли мы, что в программе может потребоваться актер, который не является неизменным (то есть кеш). Я только что посмотрел презентацию Джо Армстронга на infoq , и он выглядел довольно догматично в этом отношении!

  • Допустим ли мы, что поиск данных может быть дорогим (потому что мы никогда не сможем его кэшировать)? Если да, то как мы можем контролировать, например, нагрузку на некоторый общий ресурс (например, базу данных)

  • Есть ли какая-то волшебная волшебная пыль, о которой я пока не знаю, которая решает всю проблему, а затем делает хорошую чашку чая.

Конечно, поиск в Google для "Erlang Cache", похоже, дает довольно мало результатов ...

Ответы [ 3 ]

4 голосов
/ 15 июня 2009

Запоминание функции . Кеш - это просто список / словарь, и, следовательно, может быть реализован чисто функциональным способом.

3 голосов
/ 16 июня 2009

Это данные, которые должны быть неизменными в Эрланге, а не актеры.

Долгоживущие акторы обычно живут в хвостовой рекурсивной функции, аргументы которой служат своим состоянием и, безусловно, могут меняться между вызовами.

-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, «состояние» актера изменяется, даже если все задействованные данные неизменны.

3 голосов
/ 15 июня 2009

Нет причин, по которым кэш и функциональный язык не могут жить вместе. Чтобы быть функциональным, нужно просто соблюдать ограничение, что при вызове одной и той же функции с одинаковыми аргументами вы получите один и тот же ответ.

Например: get_data (Query, CacheCriteria)

То, что get_data использует кеш, не означает, что он не работает. Если вызов get_data с одинаковыми аргументами Query и CacheCriteria всегда возвращает одно и то же значение, язык можно считать функциональным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...