Функциональные языки и поддержка memoization
Есть ли у какой-либо из нынешних культур популярных функциональных языков хорошую поддержку для memoization, и если бы я должен был выбрать один из своих воспоминаний, которые вы бы порекомендовали и почему?
Обновление: я ищу оптимизацию ориентированного графика (где узлы могут быть функциями или данными). Когда обновляется node в графике, я хотел бы пересчитать значения других узлов, только если они зависят от измененного node.
Update2: требуется бесплатный язык или среда с открытым исходным кодом.
Ответы
Ответ 1
Для Haskell, Коналл Эллиотт опубликовал красивую запись в блоге функциональные заметки. Работа необычайно умна и довольно глубока, и позднее Конал расширил ее до полиморфных функций. Независимо от того, какой язык вы используете, этот материал настоятельно рекомендуется, потому что он раскрывает глубинные идеи лежащую в основе memoization в функциональных языках.
Однако, глядя на ваше обновление, неясно, что memoization действительно то, что вы хотите. Ваш расширенный оператор проблемы (распространение обновлений через ориентированный граф) является почти учебным примером инкрементного вычисления, на котором большая работа была выполнена Бобом Харпером и Umut Acar. Я считаю, что у них есть бесплатная библиотека, написанная в стандартном ML. Посмотрите страницу Umut на самонастраивающееся вычисление.
Ответ 2
В Haskell см. этот для начала.
Для Lisp этот стал первым хитом от Google, который выглядел актуальным.
Для F # этот может быть хорошим местом для начала.
Теперь я закончил Google для вас. Есть ли такая хорошая поддержка? Вы решаете: -)
О, я бы порекомендовал Mathematica, но я понимаю, что многие люди откладывают свою цену. Строго говоря, это, скорее, больше система перезаписи терминов, чем система функционального программирования, и она не чиста ни в каких смыслах слова. Но это делает memoization.
EDIT: Я забыл Эрланга, у которого в настоящий момент много тяги - я не знаю, как, но я ожидаю, что он может сделать memoization.
Ответ 3
Да, вам вообще не нужна мемуаризация, вам нужно точное отслеживание зависимостей.
Вы можете использовать библиотеку функциональных графов Haskell (fgl) для создания ур-ориентированного графа, а затем использовать функцию-преемник, чтобы точно знать, какие узлы обновлять: http://hackage.haskell.org/cgi-bin/hackage-scripts/package/fgl
Эта статья значительно поможет понять документы: http://web.engr.oregonstate.edu/~erwig/fgl/
Функция-преемник называется suc, в модуле Data.Graph.Inductive.Graph
Идя в другом направлении, одним популярным функциональным языком, поддерживающим это, является Excel.:)