Size: a a a

Clojure — русскоговорящее сообщество

2019 August 25

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
> Она полностью детерминирована.
результат-то разный может возвращаться от вызова к вызову.
при изменении данных в базе
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Sergey Trofimov
> Она полностью детерминирована.
результат-то разный может возвращаться от вызова к вызову.
при изменении данных в базе
так я про то, что там транзакция открывается снаружи
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
и никто не меняет состояние в это транзакции
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ну, есть термины идемпотентность и ссылочная прозрачность
источник

A

Aleksey @cheatex in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
так я про то, что там транзакция открывается снаружи
По вашему описанию результат функции помимо аргументов зависит от состояния сети. Такую функцию нельзя назвать детерминированной. Отказ системной шины - не моделируемая языком/средой ситуация, считается что в таком случе программа гарантировано перестаёт выполняться. Отказ сети моделируемая ситуация, программа может среагировать и выбрать что делать дальше.
источник

A

Aleksey @cheatex in Clojure — русскоговорящее сообщество
Думаю проще сказать что это обычная функция, чем документировать как детерминированную при таком-то списке условий. Это устраняет риск что список кто-то пропустит или поймёт неправильно. Второй кейс вообще не понял.
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Aleksey @cheatex
Думаю проще сказать что это обычная функция, чем документировать как детерминированную при таком-то списке условий. Это устраняет риск что список кто-то пропустит или поймёт неправильно. Второй кейс вообще не понял.
Вопрос возник из-за того, что я стал разбираться как люди изолируют эффекты, в частности я смотрел на концепцию functional core imperative shell.

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

Только датомик создает илюзию того, что база данных это значение.  Если есть недостающие сегменты, то он лениво докачивает их по сети.
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Я хочу найти какую-то информацию о подобных подходах.
О практически чистых функциях.
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
И замене обычных данных ленивыми, для отделелния эффектов от логики.
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Функцию из случая 1 можно заменить объектом, с интерфейсом хэшмапы, который лениво загружает данные, а потом кэширует.
источник

v

vveare138 in Clojure — русскоговорящее сообщество
смотрел в сторону хэндлеров эффектов?
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
vveare138
смотрел в сторону хэндлеров эффектов?
да, есть eff-lang, для хаскеля монада eff
но это гарантированно делает функцию не чистой.

а тут можно создать иллюзию чистоты, передавая ленивые коллекции
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
* ленивые коллекции с побочным эффектом =)
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
и конечно не все эффекты можно заменить на ленивые коллекции
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
Вопрос возник из-за того, что я стал разбираться как люди изолируют эффекты, в частности я смотрел на концепцию functional core imperative shell.

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

Только датомик создает илюзию того, что база данных это значение.  Если есть недостающие сегменты, то он лениво докачивает их по сети.
Это все не работает. Нужны логи, перехват исключений, и кроме датомика Кассандра и Кафка.
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Я бы тоже хотел чтобы приложение состояло из одного источника данных и функции.
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Ivan Grishaev
Это все не работает. Нужны логи, перехват исключений, и кроме датомика Кассандра и Кафка.
Пока идея в том, что на вход функции, реализующей бизнес-логику, передаются параметры, в том числе ленивые коллекции, а возвращает эта функция эффекты. Т.е. запись в лог это эффект
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
При этом тут нет dependency inversion
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Что упрощает тестирование
источник

AK

Aleksey Kislitsa in Clojure — русскоговорящее сообщество
Подскажите канал для нубских вопросов по Clojure, типа какой консольный REPL есть приличный с поддержкой автодополнения и возможностью историю команд листать, типа как у racket/ghci/python, please
источник