LINUX.ORG.RU

Возможно ли кэширование в рамках чистого FP?

 ,


0

2

Кеширование, по идее, предусматривает создание некоторой муттабельной структуры, в отличии от мемоизации, насколько я понимаю. Получается, что в FP это невозможно. Таким образом, существует класс задач (или алгоритмов), принципиально нереализуемых в рамках fp. Любопытно было бы узнать, а что еще входит в этот класс? И почему FP, несмотря на эти ограничения, считается тьюринг-полным и эквивалентным, по своим возможностям, императивному программированю? Это миф?

Открою тебе тайну. Просветления достигают великие мастера после многих лет странствий и медитаций. Слушай и внимай. А рамках чистого фп ты берешь... и выходишь за рамки чистого фп. А потом идешь валяться в ванной с девочками

vertexua ★★★★★
()

В рамках чистого FP кэширование всегда (на уровне языка), так как все функции чистые.

Таким образом, существует класс задач (или алгоритмов), принципиально нереализуемых в рамках fp.

Состояние реализуется через монаду, поэтому вопрос чисто синтаксический. Любой алгоритм реализуем.

monk ★★★★★
()
Ответ на: комментарий от vertexua

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

vertexua ★★★★★
()

напиши сам свой стейт и обмазывайся им

stevejobs ★★★★☆
()
Ответ на: комментарий от anonimous

Нет никакой принципиальной разницы между изменением структуры и возвратом изменённой структуры (и хаскеллевский State тому наглядный пример). От этого зависит производительность, но не вычислимость (ради которой МТ и другие и запилили).

quantum-troll ★★★★★
()
Ответ на: комментарий от quantum-troll

А как можно вернуть измененную структуру, если ее никто не изменял? С точки зрения семантики, я имею в виду. Получается, что в семантике присутствуют «грязные фокусы» и, фактически, понять такую семантику, можно только если поверить в волшебство. Ведь если мы пищем в ФП-стиле, мы и думать должны в ФП-стиле, functional thinking, так сказать. И, опять же, является ли монада state частью функциональной парадигмы?

anonimous
() автор топика
Ответ на: комментарий от vertexua

Я тоже так думаю, синтаксис вообще не важен. И тут еще одно всплывает. Абстракция — неотъемлемая часть программирования. Мы можем абстрагироваться от чего угодно, так что же мешает абстрагироваться от изменений?

anonimous
() автор топика
Ответ на: комментарий от anonimous

мы и думать должны в ФП-стиле

Не путай стиль и парадигму. На любом языке можно написать программу на фортране.

И, опять же, является ли монада state частью функциональной парадигмы?

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

quantum-troll ★★★★★
()
Ответ на: комментарий от vertexua

Вот, допустим, есть функция которая возвращает результат, зависимый от состояния. например sum=f()(a+b). а и b тут — муттабельные переменные. Но почему мы должны думать об этих функциях как о грязных? Она возвращает сумму аргументов, и ее результат НЕ зависит от состояния этих переменных. Она возвращает «сумму своих аргументов» а не конкретное число. Если мы думаем о результате вычисления не как о цифре, а как о сумме аргументов, то эта функция возвращает всегда одно и тоже — сумму аргументов.

anonimous
() автор топика
Ответ на: комментарий от quantum-troll

чтобы не делать каждый раз функциональные трюки явно.

И опять вернулись к исходному: невозможно реализовать кэширование только с помощью «явных функциональных трюков»

anonimous
() автор топика
Ответ на: комментарий от anonimous

А разве монада не выходит за рамки чистого ФП?

Съеби уже.

anonymous
()
Ответ на: комментарий от quantum-troll

Нет, я сказал, что они муттабельны. И это не меняет ничего, поскольку мы возвращаем сумму, и думаем об этом как о сумме аргументов, чем бы они ни были в текущий момент. Никаких если.

anonimous
() автор топика
Ответ на: комментарий от quantum-troll

Передавать дополнительные данные из функции в функцию, очевидно же.

Что толку в этой передаче, если данные эти никогда не изменяются.

anonimous
() автор топика
Ответ на: комментарий от anonimous

если данные эти никогда не изменяются

Кто тебе это сказал? Отсутствие переменных не означает неизменности данных.

quantum-troll ★★★★★
()
Ответ на: комментарий от anonimous

Ну смотри, есть функция pribavjEdinitchku x = x + 1. И мы подаём на вход одни данные, а на выходе получаем другие? Да. Так в чём проблема?
Иммутабельность означает, что нет никакого глобального состояния, которое можно изменить (изменив тем самым поведение других функций).

quantum-troll ★★★★★
()
Ответ на: комментарий от aedeph_

Я узнал в общих чертах, впредыдущем треде. Но ты не увиливай: ты опять облажался — брякнул не в тему.

anonimous
() автор топика
Ответ на: комментарий от anonimous

Нет, не узнал, очевидно, тебе ни знаний, ни интеллектуального уровня не хватило.

Иначе бы понял, как и почему ссылка в тему.

aedeph_ ★★
()
Ответ на: комментарий от anonimous

Но мы можем передавать их каждому, кого вызовем, и совершенно не нужно их где-то хранить. Вот конкретная дипломатия!

quantum-troll ★★★★★
()
Ответ на: комментарий от quantum-troll

В таком случае, это не соответствует абстракции кэширования.

anonimous
() автор топика
Ответ на: комментарий от anonimous

За народ не беспокойся, любая моя глупость померкнет на твоём фоне

дурачек

беспросветно.

aedeph_ ★★
()
Ответ на: комментарий от anonymous

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

anonimous
() автор топика
Ответ на: комментарий от anonimous

Интересно, кем ты себя представляешь в своих влажных фантазиях. Есть ли у тебя конь, шпага или развевающийся на ветру плащ?

anonymous
()
Ответ на: комментарий от anonimous

мы не можем сохранить эти данные для повторного использования

можем

(new_cache, result) = pure_func(old_cache, x1, x2 , ...)

monk ★★★★★
()
Ответ на: комментарий от monk

У тебя функция, которая пользуется этим кэшем, знает его под именем old_cache. Какой толк в том, что ты определил new_cache?

anonymous
()
Ответ на: комментарий от monk

То есть, ты хочешь сказать, что надо каждый раз вручную передавать новый кеш явным аргументом? Тогда какой смысл в этом?

anonymous
()
Ответ на: комментарий от anonymous

То есть, ты хочешь сказать, что надо каждый раз вручную передавать новый кеш явным аргументом?

Разумеется, ты же должен получить его новое значение.

Чтобы не явно, делается монада:

fibm 0 = return 0
fibm 1 = return 1
fibm n = do
  n1 <- memo fibm (n-1)
  n2 <- memo fibm (n-2)
  return (n1+n2)

monk ★★★★★
()

И причем тут хаскелл? Его чистота заключается в контроле побочных эффектов, а не в их исключении, иначе IO бы в нем не было. Далее мемоизация это частный случай кеширования и она прекрасно ложится на чистые функции хаскелла, в отличии от других языков.

Далее там какие то твои фантазии или мечты про ущербность ФП. Тут я тебе могу сказать только - сходи проветрись.

anonymous
()

Открой для себя монады и/или uniqueness types

buddhist ★★★★★
()
Ответ на: комментарий от anonimous

Она возвращает «сумму своих аргументов» а не конкретное число.

Ну если ты эти аргументы в ф-ю в том или ином виде передаешь (например как в CLean в виде World - семантически на вход ф-и идет вся вселенная), то все ок, функция чистая.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.